Introduction
A comparison of JULES-ES-1p0 wave01 members against the original ensemble (wave00).
Wave 01 input parameter sets were picked using History matching to fall within Andy Wiltshire’s basic constraints on NBP, NPP, cSoil and cVeg stocks at the end of the 20th century. We use 300 of the 500 members, keeping back 2/5ths for emulator validation later.
We answer some basic questions.
What proportion of the new ensemble match AW’s constraints?
What do the timeseries of carbon cycle properties look like with and without AW’s constraints?
How good is a GP emulator? Does it get better overall with the new ensemble members added? In particular, does it get better for those members within the AW constraints?
Does comparison of the ensemble with Atmospheric growth observations give more of a constraint?
To do:
Does the sensitivity analysis change?
Preliminaries
Load libraries, functions and data.
How many run failures were there?
There are no NAs but some relative humidity values are infinite. There are no “low NPP” ensemble members
[1] 117464.6
[1] FALSE
row col
[1,] 140 9
[2,] 232 9
[3,] 249 9
[4,] 300 9
[1] Inf Inf Inf Inf
[1] "rh_lnd_sum"
Ensemble behaviour in all outputs
Need the modern value standard.

Ensemble behaviour in key (constraining) outputs.
Global mean for the 20 years at the end of the 20th Century. There is still a significant low bias on cVeg output.

What proportion of models now fall within Andy’s constraints?
Just over a third! Better than before, but still not great. Pointing at a significant model discrepency in cVeg
Of the 400 members of the wave01 ensemble, 128 pass Andy Wiltshire’s Level 2 constraints.
[1] 128
Pairs plot of the inputs that pass the constraints with respect to the limits of the original ensemble.

Timeseries of mean carbon cycle properties over whole run.
timeseries outliers
Timeseries that have problems. NBP, RH and cSoil seems to have large outliers
[1] 78 31 243 249 300

This is a plot of timeseries of Wave00, Wave01, and level2-constrained wave01 on top of one another. We see that the wave01 is closer to the standard than wave00, and the level-2 constrained wave01 ensemble is often closer again. However, there are still quite large discrepancies. For example, baresoilfrac is often way too high, shrubfrac is often too low (though both these span the standard). Treefrac is away from zero, but still often too low or too high. While fHarvest looks good, fLuc does not appear constrained by the process at all. RH (soil respiration) looks well constrained, whereas lai is often too low.
One thing we could do next is constrain input space again, using observations or “tolerance to error” on some or all of these outputs.
We could also extend sensitivity analysis to work out what controls e.g. treefrac.
A summary of what gets constrained when you constrain the top-level variables would be a useful aanalysis.
Anomaly timeseries
Similar to above, but output anomaly

Emulator fits
We hope that running the new ensemble gives us a better emulator, and allows us to rule out more input space. We particularly hope that the emulator is better for those members that are inside AW’s constraints.
First, we can look at the emulator errors in two cases: The level1a data (a basic carbon cycle), and then with the Wave01 data, which should have similar characteristics. (We should have eliminated really bad simulations, but wave01 is not constrained the data perfectly to be within AW constraints.)
Found the outlier - looks like it’s 440
Leave-one-out analyses of emulator prediction accuracy
The top row shows the leave-one-out prediction accuracy of the original wave00 ensemble, and the lower row the entire wave00 AND wave01 ensemble combined.
Emulator accuracy of members from wave 00 and wave 01 that pass level 2 (AW’s) constraints
We see that the error stats for some of the outputs from wave01 are worse, but there are many more ensemble members that lie within the constraints for wave 01.
“pmae” is “proportional mean absolue error”, which is the mean absolute error expressed as a percentage of the original (minimally constrained) ensemble range in that output.
Does the emulator improve is you look at only the 37 members that pass level 2 constraints in wave 00?
This gives us an idea of how good the emulator is where it really matters, and as the members are consistent, gives us a fairer idea of whether the emulators have improved with more members.
Good news is, the emulators are more accurate for wave01.
These leave-one-out prediction accuracy plots rank the ensemble members from largest underprediction to largest overprediction using the wave00 predictions. A perfect prediction would appear on the horizontal “zero” line.
Many of the wave01 predictions are closer to the horizontal line, and therefore more accurate predictions.
None of the predictions are outside the uncertainty bounds, which suggests they are overconservative (should be smaller).
Looking at the proportional mean absolute error (pmae), expressed in percent, we can see that it doesn’t improve much for the whole ensemble, but does improve significantly for the subset of ensemble members that fall within AW’s constraints from the first ensemble (marked "_sub").
pmae_wave00 <- lapply(loostats_km_Y_level1a, FUN = function(x) x$pmae )
pmae_wave01 <- lapply(loostats_km_Y_level1a_wave01, FUN = function(x) x$pmae )
pmae_wave00_sub <- lapply(loostats_km_Y_level1a_sub, FUN = function(x) x$pmae )
pmae_wave01_sub <- lapply(loostats_km_Y_level1a_wave01_sub, FUN = function(x) x$pmae )
pmae_table <- cbind(pmae_wave00, pmae_wave01, pmae_wave00_sub, pmae_wave01_sub)
print(pmae_table)
Comparing atmospheric growth in wave00, wave01 and observations
Need to remove Timeseries outliers here
Andy asks - what constraint does that give us in cumulative NBP?
Eddy suggests measuring cumulative NBP against atmospheric growth rate

Calculate the atmospheric growth rate of 1984- 2013 using a simple linear fit
Interannual variability and cumulative NBP
(correlations are close to zero, especially in the later wave)
How close can we get the model to reality?
Using Atmospheric Growth Rate as an example, how close can we get the model to observations? Can we do better than standard? What are the trade offs of doing so? How does getting close in AGR affect performance in other outputs?
We’ve established that most of the original ensemble have an ME/MAE/RMSE larger than the standard run. More (but few) of the wave01 perform better than standard.
A map of the 2D projections of parameter space where the ensemble member performs better than standard.
The blue part is the first wave, and not subject to constraint so may be removed in the second wave (wave01).
Build emulators and find parts of parameter space that to better than standard at atmospheric growth.
Having trouble fitting RMSE, to trying mean error.
Why is there an odd collection at just under 1?
This next pairs plot looks at all the ensemble members that have a better mean atmospheric growth error than standard.
This next plot looks at all the ensemble members that have a better mean atmospheric growth error than standard AND pass the level 2 constraints.
The number is small (41/300), but the ensemble members seem spread across parameter space.
Input space with emulated members passing Level 2 constraints.
Exploring further constraints
It’s pretty clear that the “initial” (level2) constraints can be improved on. How about tree, shrub and bare soil fractions?
Build an ensemble of modern vegetation fractions.
Leave-one-out analyses of emulator prediction accuracy
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgSlVMRVMxcDAgZW5zZW1ibGUgd2F2ZTAxIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCiMgSW50cm9kdWN0aW9uCgpBIGNvbXBhcmlzb24gb2YgSlVMRVMtRVMtMXAwIHdhdmUwMSBtZW1iZXJzIGFnYWluc3QgdGhlIG9yaWdpbmFsIGVuc2VtYmxlICh3YXZlMDApLgoKV2F2ZSAwMSBpbnB1dCBwYXJhbWV0ZXIgc2V0cyB3ZXJlIHBpY2tlZCB1c2luZyBIaXN0b3J5IG1hdGNoaW5nIHRvIGZhbGwgd2l0aGluIEFuZHkgV2lsdHNoaXJlJ3MgYmFzaWMgY29uc3RyYWludHMgb24gTkJQLCBOUFAsIGNTb2lsIGFuZCBjVmVnIHN0b2NrcyBhdCB0aGUgZW5kIG9mIHRoZSAyMHRoIGNlbnR1cnkuIFdlIHVzZSAzMDAgb2YgdGhlIDUwMCBtZW1iZXJzLCBrZWVwaW5nIGJhY2sgMi81dGhzIGZvciBlbXVsYXRvciB2YWxpZGF0aW9uIGxhdGVyLgoKV2UgYW5zd2VyIHNvbWUgYmFzaWMgcXVlc3Rpb25zLgoKV2hhdCBwcm9wb3J0aW9uIG9mIHRoZSBuZXcgZW5zZW1ibGUgbWF0Y2ggQVcncyBjb25zdHJhaW50cz8KCldoYXQgZG8gdGhlIHRpbWVzZXJpZXMgb2YgY2FyYm9uIGN5Y2xlIHByb3BlcnRpZXMgbG9vayBsaWtlIHdpdGggYW5kIHdpdGhvdXQgQVcncyBjb25zdHJhaW50cz8KCkhvdyBnb29kIGlzIGEgR1AgZW11bGF0b3I/IERvZXMgaXQgZ2V0IGJldHRlciBvdmVyYWxsIHdpdGggdGhlIG5ldyBlbnNlbWJsZSBtZW1iZXJzIGFkZGVkPyBJbiBwYXJ0aWN1bGFyLCBkb2VzIGl0IGdldCBiZXR0ZXIgZm9yIHRob3NlIG1lbWJlcnMgd2l0aGluIHRoZSBBVyBjb25zdHJhaW50cz8KCkRvZXMgY29tcGFyaXNvbiBvZiB0aGUgZW5zZW1ibGUgd2l0aCBBdG1vc3BoZXJpYyBncm93dGggb2JzZXJ2YXRpb25zIGdpdmUgbW9yZSBvZiBhIGNvbnN0cmFpbnQ/CgpUbyBkbzoKCkRvZXMgdGhlIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGNoYW5nZT8KCiMgUHJlbGltaW5hcmllcwpMb2FkIGxpYnJhcmllcywgZnVuY3Rpb25zIGFuZCBkYXRhLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQojIExvYWQgaGVscGVyIGZ1bmN0aW9ucwoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImZpZ3MvIiwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UpCgojIGxvYWQgaGVscGVyIGZ1bmN0aW9ucywgZGF0YSBhbmQgZG8gcHJlbGltaW5hcnkgcHJvY2Vzc2luZyBvZiB0aGUgZW5zZW1ibGUuCnNvdXJjZSgnSlVMRVMtRVMtMXAwLWNvbW1vbi5SJykKCmBgYAoKYGBge3J9CgojZW5zbG9jX3dhdmUwMSA8LSAnL3NjcmF0Y2gvaGFkYXcvanVsZXNfcG9zdHByb2Nlc3MvdS1jazAwNi8nCmVuc2xvY193YXZlMDEgPC0gJy9kYXRhL3VzZXJzL2hhZGF3L0pVTEVTX0VTX1BQRS91LWNrMDA2LycKCiMgTnVtYmVyIG9mIGVuc2VtYmxlIG1lbWJlcnMgKG91dCBvZiA1MDApIHRvIHVzZSBmb3IgdHJhaW5pbmcgaW4gd2F2ZTAxCm50cmFpbl93YXZlMDEgPC0gNDAwCgpgYGAKCgpgYGB7cn0KCm1ha2VKdWxlc0Vuc2VtYmxlTW9kZXJuVmFsdWUgPC0gZnVuY3Rpb24oZW5zbG9jLCB2YXJsaXN0LCBuc3RhcnQsIG5lbmQsIGl4ID0gMTQ0OjE2NCl7CgogIG5lbnMgPC0gKG5lbmQgLSBuc3RhcnQpICsgMQogIGRhdG1hdCA8LSBtYXRyaXgobnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgodmFybGlzdCkpCiAgY29sbmFtZXMoZGF0bWF0KSA8LSB2YXJsaXN0CgogIGVuc2xpc3QgPC0gcGFzdGUoIlAiLCBmb3JtYXRDKG5zdGFydDpuZW5kLCB3aWR0aD00LCBmbGFnPSIwIiksIHNlcD0iIikKCiAgZm9yKGkgaW4gMTpuZW5zKXsKCiAgICB2ZWMgPC0gcmVwKE5BLCBsZW5ndGgodmFybGlzdCkpCgogICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0KCiAgICBmbiA8LSBwYXN0ZTAoZW5zbG9jLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKCiAgICB0cnkobmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKSkKICAgIHRyeSh2ZWMgPC0gc2FwcGx5KHZhcmxpc3QsIEZVTiA9IG1vZGVyblZhbHVlLCBuYyA9IG5jLCBpeCA9IGl4KSkKICAgIGRhdG1hdFtpLCBdIDwtIHZlYwogICAgbmNfY2xvc2UobmMpCiAgfQogIHJldHVybihsaXN0KGRhdG1hdCA9IGRhdG1hdCwgZW5zbGlzdCA9IGVuc2xpc3QpKQp9CgoKIyBtYWtlSnVsZXNFbnNlbWJsZU1vZGVyblZhbHVlIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFybGlzdCwgbnN0YXJ0LCBuZW5kLCBpeCA9IDE0NDoxNjQpewojICAgCiMgICBuZW5zIDwtIChuZW5kIC0gbnN0YXJ0KSArIDEKIyAgIGRhdG1hdCA8LSBtYXRyaXgobnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgodmFybGlzdCkpCiMgICBjb2xuYW1lcyhkYXRtYXQpIDwtIHZhcmxpc3QKIyAgIAojICAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMobnN0YXJ0Om5lbmQsIHdpZHRoPTQsIGZsYWc9IjAiKSwgc2VwPSIiKQojICAgCiMgICBmb3IoaSBpbiAxOm5lbnMpewojICAgICAKIyAgICAgdmVjIDwtIHJlcChOQSwgbGVuZ3RoKHZhcmxpc3QpKQojICAgICAKIyAgICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0gCiMgICAgIAojICAgICBmbiA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlciwnL3N0YXRzLycsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQojICAgICAKIyAgICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiMgICAgIHRyeSh2ZWMgPC0gc2FwcGx5KHZhcmxpc3QsIEZVTiA9IG1vZGVyblZhbHVlLCBuYyA9IG5jLCBpeCA9IGl4KSkKIyAgICAgZGF0bWF0W2ksIF0gPC0gdmVjCiMgICAgIG5jX2Nsb3NlKG5jKQojICAgfQojICAgcmV0dXJuKGxpc3QoZGF0bWF0ID0gZGF0bWF0LCBlbnNsaXN0ID0gZW5zbGlzdCkpCiMgfQoKCgpgYGAKCgpgYGB7cn0KbnN0YXJ0IDwtIDQ5OQpuZW5kIDwtIChuc3RhcnQgKyBudHJhaW5fd2F2ZTAxKSAtIDEKCmlmIChmaWxlLmV4aXN0cygiZW5zZW1ibGVfd2F2ZTAxXzIwMjItMDQtMDgucmRhdGEiKSkgewogIGxvYWQoImVuc2VtYmxlX3dhdmUwMV8yMDIyLTA0LTA4LnJkYXRhIikKfSBlbHNlIHsKICAKZW5zX3dhdmUwMV9tdiA8LSBtYWtlSnVsZXNFbnNlbWJsZU1vZGVyblZhbHVlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybGlzdCA9IHlfbmFtZXNfc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gbnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVuZCA9IG5lbmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSAxNDQ6MTY0KSAKICAKICBzYXZlKGVuc193YXZlMDFfbXYsIGZpbGUgPSJlbnNlbWJsZV93YXZlMDFfMjAyMi0wNC0wOC5yZGF0YSIpCn0KICAKYGBgCgpgYGB7cn0KCmxoc193YXZlMDEgPC0gcmVhZC50YWJsZSggJy4uL2NvbmZfZmlsZXNfYXVnbWVudF9KVUxFUy1FUy0xcDAvbGhzX2V4YW1wbGUudHh0JywgaGVhZGVyID0gVFJVRSkKClhfd2F2ZTAxID0gbm9ybWFsaXplKGxoc193YXZlMDEsIHdydCA9IHJiaW5kKGxoc19pLCBsaHNfaWksIGxoc193YXZlMDEpKQpjb2xuYW1lcyhYX3dhdmUwMSkgPSBjb2xuYW1lcyhsaHNfd2F2ZTAxKQoKIyBNYXRjaCB0aGUgMzAwIG91dHB1dHMgd2UncmUgdXNpbmcgaW4gdGhlIHRyYWluaW5nIGRhdGEKWF93YXZlMDFfdHJhaW4gPC0gWF93YXZlMDFbMTpudHJhaW5fd2F2ZTAxLCBdCgpgYGAKCmBgYHtyfQpZX2NvbnN0X3dhdmUwMSA8LSBlbnNfd2F2ZTAxX212JGRhdG1hdFssIHluYW1lc19jb25zdF0KCllfY29uc3Rfd2F2ZTAxX3NjYWxlZCA8LSBzd2VlcChZX2NvbnN0X3dhdmUwMSwgMiwgU1RBVFMgPSBzY2FsZXZlYywgRlVOID0gJy8nICkKCgpgYGAKCiMjIEhvdyBtYW55IHJ1biBmYWlsdXJlcyB3ZXJlIHRoZXJlPyAgCgpUaGVyZSBhcmUgbm8gTkFzIGJ1dCBzb21lIHJlbGF0aXZlIGh1bWlkaXR5IHZhbHVlcyBhcmUgaW5maW5pdGUuClRoZXJlIGFyZSBubyAibG93IE5QUCIgZW5zZW1ibGUgbWVtYmVycwoKYGBge3J9Cgpsb3dfbnBwX2l4X3dhdmUwMSA8LSB3aGljaChlbnNfd2F2ZTAxX212JGRhdG1hdFssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDFlNSkKCm1pbihlbnNfd2F2ZTAxX212JGRhdG1hdFssJ25wcF9ubGltX2xuZF9zdW0nXSkKCllfd2F2ZTAxX25sZXZlbDBfaXggPC0gd2hpY2goaXMubmEoZW5zX3dhdmUwMV9tdiRkYXRtYXRbLCduYnBfbG5kX3N1bSddKSkKCmFsbChpcy5maW5pdGUoZW5zX3dhdmUwMV9tdiRkYXRtYXQpKQoKd2hpY2goIWlzLmZpbml0ZShlbnNfd2F2ZTAxX212JGRhdG1hdCksIGFyci5pbmQgPSBUUlVFKQoKZW5zX3dhdmUwMV9tdiRkYXRtYXRbd2hpY2goIWlzLmZpbml0ZShlbnNfd2F2ZTAxX212JGRhdG1hdCksIGFyci5pbmQgPSBUUlVFKV0KCmNvbG5hbWVzKGVuc193YXZlMDFfbXYkZGF0bWF0KVs5XQoKCmBgYAoKCgojIEVuc2VtYmxlIGJlaGF2aW91ciBpbiBhbGwgb3V0cHV0cwoKTmVlZCB0aGUgbW9kZXJuIHZhbHVlIHN0YW5kYXJkLgoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gMTB9CgoKcGFyKG1mcm93ID0gYyg1LDMpLCBmZyA9ICdncmV5JywgbGFzID0gMSkKZm9yIChpIGluIHlfbmFtZXNfc2VsZWN0KXsKICAKICAKICBoaXN0KFlfbGV2ZWwxYVssIGldLCBtYWluID0gaSwgY29sID0gJ2dyZXknLCB4bGFiID0gJycpCiAgCn0KCgoKCmBgYAoKCgojIEVuc2VtYmxlIGJlaGF2aW91ciBpbiBrZXkgKGNvbnN0cmFpbmluZykgb3V0cHV0cy4gCgpHbG9iYWwgbWVhbiBmb3IgdGhlIDIwIHllYXJzIGF0IHRoZSBlbmQgb2YgdGhlIDIwdGggQ2VudHVyeS4gVGhlcmUgaXMgc3RpbGwgYSBzaWduaWZpY2FudCBsb3cgYmlhcyBvbiBjVmVnIG91dHB1dC4KCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KCndhdmUwMGNvbCA8LSAnc2t5Ymx1ZTInCndhdmUwMWNvbCA8LSAndG9tYXRvMicKCndhdmUwMGNvbCA8LSAnZG9kZ2VyYmx1ZTInCndhdmUwMWNvbCA8LSAnZmlyZWJyaWNrJwpyYW5nZWNvbCA8LSAnZ3JleScKCgojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCmhjb2wgPSAnZGFya2dyZXknCmxjb2wgPSAnYmxhY2snCgojcGRmKGZpbGUgPSAnZmlncy9sZXZlbF8yX2NvbnN0cmFpbnRzX2hpc3RzLnBkZicsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcGFyKG1mcm93ID0gYygyLDIpLCBmZyA9ICdkYXJrZ3JleScsIGxhcyA9IDEsIG9tYSA9IGMoMC4xLCAwLjEsIDQsIDAuMSkpCgp0cnVuYyA8LSBmdW5jdGlvbih4LCB2ZWMpewogIAogIGRhdCA8LSB4W3ggPCBtYXgodmVjKSAmIHggPiBtaW4odmVjKSAgXQogIAogIGRhdAogIAp9CgoKaCA8LSBoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddLCBtYWluID0gJ05CUCcsIHhsYWIgPSAnR3RDL3llYXInLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCkpCmhpc3QodHJ1bmMoWV9jb25zdF93YXZlMDFfc2NhbGVkIFssJ25icF9sbmRfc3VtJ10sIGgkYnJlYWtzKSAsCiAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwxNTApICwgYnJlYWtzID0gaCRicmVha3MsIGFkZCA9IFRSVUUpCgpydWcoWV9jb25zdF9zdGFuX3NjYWxlZFsnbmJwX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoMCwgMTAwLCAxMDAsIDApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wpKQoKaCA8LSBoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10sY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCBtYWluID0gJ05QUCcsIHhsYWIgPSAnR3RDL3llYXInKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCducHBfbmxpbV9sbmRfc3VtJ10sIGgkYnJlYWtzKSAsIAogICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wpICwgYnJlYWtzID0gaCRicmVha3MsIGFkZCA9IFRSVUUpCgpydWcoWV9jb25zdF9zdGFuX3NjYWxlZFsnbnBwX25saW1fbG5kX3N1bSddLCBsd2QgPSAyKQoKcG9seWdvbih4ID0gYygzNSwgODAsIDgwLCAzNSksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCkpCgoKaCA8LSBoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSwgbWFpbiA9ICdTb2lsIENhcmJvbicsIHhsYWIgPSAnR3RDJykKaGlzdCh0cnVuYyhZX2NvbnN0X3dhdmUwMV9zY2FsZWQgWywnY1NvaWxfbG5kX3N1bSddLCBoJGJyZWFrcykgLCAKICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDE1MCkgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWydjU29pbF9sbmRfc3VtJ10sIGx3ZCA9IDIpCgpwb2x5Z29uKHggPSBjKDc1MCwgMzAwMCwgMzAwMCwgNzUwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCmggPC0gaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSwgbWFpbiA9ICdWZWdldGF0aW9uIENhcmJvbicsIHhsYWIgPSAnR3RDJykKaGlzdCh0cnVuYyhZX2NvbnN0X3dhdmUwMV9zY2FsZWQgWywnY1ZlZ19sbmRfc3VtJ10sIGgkYnJlYWtzKSAsIAogICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDE1MCkgICwgYnJlYWtzID0gaCRicmVha3MsIGFkZCA9IFRSVUUpCgpydWcoWV9jb25zdF9zdGFuX3NjYWxlZFsnY1ZlZ19sbmRfc3VtJ10sIGx3ZCA9IDIpCgpwb2x5Z29uKHggPSBjKDMwMCwgODAwLCA4MDAsIDMwMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApLAogICAgICAgYm9yZGVyID0gIG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCkpCgojZGV2Lm9mZigpCgpyZXNldCgpCgpsZWdlbmQoJ3RvcCcsIGhvcml6ID0gVFJVRSwgZmlsbCA9IGMobWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMTUwKSwgbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMTUwKSwgbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCkpLCBsZWdlbmQgPSBjKCdXYXZlMDAnLCAnV2F2ZTAxJywgJ0FXIHJhbmdlJykpCmBgYAojIyBXaGF0IHByb3BvcnRpb24gb2YgbW9kZWxzICpub3cqIGZhbGwgd2l0aGluIEFuZHkncyBjb25zdHJhaW50cz8KCkp1c3Qgb3ZlciBhIHRoaXJkISBCZXR0ZXIgdGhhbiBiZWZvcmUsIGJ1dCBzdGlsbCBub3QgZ3JlYXQuIFBvaW50aW5nIGF0IGEgc2lnbmlmaWNhbnQgbW9kZWwgZGlzY3JlcGVuY3kgaW4gY1ZlZwoKYGBge3J9CkFXX2NvbnN0cmFpbnRzIDwtIG1hdHJpeChucm93ID0gMiwgbmNvbCA9IGxlbmd0aCh5bmFtZXNfY29uc3QpKQoKQVdfY29uc3RyYWludHNbMSxdIDwtIGMoMCwgMzUsIDc1MCwgMzAwKQpBV19jb25zdHJhaW50c1syLF0gPC0gYygxMDAsIDgwLCAzMDAwLCA4MDApCgpjb2xuYW1lcyhBV19jb25zdHJhaW50cykgPC0geW5hbWVzX2NvbnN0CnJvd25hbWVzKEFXX2NvbnN0cmFpbnRzKSA8LSBjKCdtaW4nLCAnbWF4JykKCgojIGNvbmZvcm0gdG8gQW5keSdzIGJhc2ljIGNvbnN0cmFpbnRzCiNsZXZlbDJfaXhfd2F2ZTAxIDwtIHdoaWNoKGFwcGx5KFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCwgMSwgRlVOID0gd2l0aGluUmFuZ2UsIG1heGVzICA9IEFXX2NvbnN0cmFpbnRzWzIsXSwgbWlucyA9IEFXX2NvbnN0cmFpbnRzWzEsXSApKQoKI25sZXZlbDJfaXhfd2F2ZTAxIDwtIHdoaWNoKGFwcGx5KFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCwgMSwgRlVOID0gd2l0aGluUmFuZ2UsIG1heGVzICA9IEFXX2NvbnN0cmFpbnRzWzIsXSwgbWlucyA9IEFXX2NvbnN0cmFpbnRzWzEsXSApID09IEZBTFNFKQoKbGV2ZWwyX2l4X3dhdmUwMSA8LSB3aGljaChZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF93YXZlMDFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddID4gMzUgJiBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF93YXZlMDFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF93YXZlMDFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCAmCiAgICAgICAgICAgICAgICAgIFlfY29uc3Rfd2F2ZTAxX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF93YXZlMDFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICAgICAgICAgICAgICAgICAgKQoKCmBgYAoKT2YgdGhlIDQwMCBtZW1iZXJzIG9mIHRoZSB3YXZlMDEgZW5zZW1ibGUsIDEyOCBwYXNzIEFuZHkgV2lsdHNoaXJlJ3MgTGV2ZWwgMiBjb25zdHJhaW50cy4KCmBgYHtyfQoKbGVuZ3RoKGxldmVsMl9peF93YXZlMDEpCgpgYGAKClBhaXJzIHBsb3Qgb2YgdGhlIGlucHV0cyB0aGF0IHBhc3MgdGhlIGNvbnN0cmFpbnRzIHdpdGggcmVzcGVjdCB0byB0aGUgbGltaXRzIG9mIHRoZSBvcmlnaW5hbCBlbnNlbWJsZS4KCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKcGFpcnMoWF93YXZlMDFbbGV2ZWwyX2l4X3dhdmUwMSwgXSwKICAgICAgeGxpbSA9IGMoMCwxKSwKICAgICAgeWxpbSA9IGMoMCwxKSwKICAgICAgZ2FwID0gMCwKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMLAogICAgICBwY2ggPSAyMCwKICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwyMDApCiAgICAgICkKCmBgYAoKIyMgVGltZXNlcmllcyBvZiBtZWFuIGNhcmJvbiBjeWNsZSBwcm9wZXJ0aWVzIG92ZXIgd2hvbGUgcnVuLgoKYGBge3J9CgojIAojVGhpcyBoYXMgYSBwcm9ibGVtIHdpdGggdmFyaWFibGUgbGVuZ3RocyBvZiB0aW1lIGluIHRoZSBydW5zIChlZyBQMDUwOSkKCiMgbWFrZVRpbWVzZXJpZXNFbnNlbWJsZSA8LSBmdW5jdGlvbihlbnNsb2MsIHZhcmlhYmxlLCBuc3RhcnQsIG5lbmQsIG50cyA9IDE2NCwgY24gPSAxODUwOjIwMTMpewojIAojICAgeXNlYyA8LSAzMTUzNjAwMAojIAojICAgbmVucyA8LSAobmVuZCAtIG5zdGFydCkgKyAxCiMgICAjIG5lbnMgaXMgbnVtYmVyIG9mIGVuc2VtYmxlIG1lbWJlcnMKIyAgICMgbnRzIGxlbmd0aCBvZiB0aW1lc2VyaWVzCiMgICAjIGNuIGlzIGNvbG5hbWVzKCkKIyAgIGRhdG1hdCA8LSBtYXRyaXgoTkEsIG5yb3cgPSBuZW5zLCBuY29sID0gbnRzKQojICAgY29sbmFtZXMoZGF0bWF0KSA8LSBjbgojIAojICAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMobnN0YXJ0Om5lbmQsIHdpZHRoPTQsIGZsYWc9IjAiKSwgc2VwPSIiKQojIAojICAgZm9yKGkgaW4gMTpuZW5zKXsKIyAKIyAgICAgI3ZlYyA8LSByZXAoTkEsbnRzKQojIAojICAgICBlbnNtZW1iZXIgPC0gZW5zbGlzdFtpXQojICAgICAjcHJpbnQoZW5zbWVtYmVyKQojIAojICAgICBmbiA8LSBwYXN0ZTAoZW5zbG9jLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKIyAKIyAKIyAgICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiMgICAgIHRyeShsb2NhbHRpbWUgPC0gbmN2YXJfZ2V0KG5jLCAndGltZScpKQojIAojICAgICAjIFRoaXMgcGFydCBjb21wZW5zYXRlcyBmb3IgdGhlIGZhY3QgdGhhdCBzb21ldGltZXMgeWVhcnMgYXJlIG1pc3NpbmcKIyAgICAgdHJ5KGxvY2FseWVhciA8LSBmbG9vcigyMDEwICsgKGxvY2FsdGltZSAvIHlzZWMpKSkKIyAgICAgdHJ5KGl4IDwtIHdoaWNoKGNuJWluJWxvY2FseWVhcikpCiMgCiMgICAgIHRyeShkYXQgPC0gZXh0cmFjdFRpbWVzZXJpZXMobmMsIHZhcmlhYmxlKSkKIyAKIyAgICAgdHJ5KGRhdG1hdFtpLCBpeF0gPC0gZGF0KQojICAgICBuY19jbG9zZShuYykKIyAgIH0KIyAgIGRhdG1hdAojIH0KCgoKIyBtYWtlVGltZXNlcmllc0Vuc2VtYmxlIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFyaWFibGUsIG5zdGFydCwgbmVuZCwgbnRzID0gMTY0LCBjbiA9IDE4NTA6MjAxMyl7CiMgICAKIyAgIG5lbnMgPC0gKG5lbmQgLSBuc3RhcnQpICsgMQojICAgIyBuZW5zIGlzIG51bWJlciBvZiBlbnNlbWJsZSBtZW1iZXJzCiMgICAjIG50cyBsZW5ndGggb2YgdGltZXNlcmllcwojICAgIyBjbiBpcyBjb2xuYW1lcygpCiMgICBkYXRtYXQgPC0gbWF0cml4KE5BLCBucm93ID0gbmVucywgbmNvbCA9IG50cykKIyAgIGNvbG5hbWVzKGRhdG1hdCkgPC0gY24KIyAgIAojICAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMobnN0YXJ0Om5lbmQsIHdpZHRoPTQsIGZsYWc9IjAiKSwgc2VwPSIiKQojICAgI2Zsb2MgPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsc3ViZGlyKQojICAgCiMgICBmb3IoaSBpbiAxOm5lbnMpewojICAgICAKIyAgICAgdmVjIDwtIHJlcChOQSxudHMpCiMgICAgIAojICAgICBlbnNtZW1iZXIgPC0gZW5zbGlzdFtpXSAKIyAgICAgCiMgICAgIGZuIDwtIHBhc3RlMChlbnNsb2MsZW5zbWVtYmVyLCcvc3RhdHMvJywnSlVMRVMtRVMtMXAwXycsZW5zbWVtYmVyLCdfQW5udWFsX2dsb2JhbC5uYycpCiMgICAgIAojICAgICAKIyAgICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiMgICAgIHRyeShkYXQgPC0gZXh0cmFjdFRpbWVzZXJpZXMobmMsIHZhcmlhYmxlKSkKIyAgICAgCiMgICAgIGRhdG1hdFtpLCBdIDwtIGRhdAojICAgICBuY19jbG9zZShuYykKIyAgIH0KIyAgIGRhdG1hdAojIH0KCmBgYAoKCmBgYHtyfQoKaWYgKGZpbGUuZXhpc3RzKCJlbnNlbWJsZV90aW1lc2VyaWVzX3dhdmUwMV8yMDIyLTA0LTA4LnJkYXRhIikpIHsKICBsb2FkKCJlbnNlbWJsZV90aW1lc2VyaWVzX3dhdmUwMV8yMDIyLTA0LTA4LnJkYXRhIikKfSBlbHNlIHsKICAKICAjIHByaW1hcnkgY2FyYm9uIGN5Y2xlIG91dHB1dHMKICAgbnBwX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsIHZhcmlhYmxlID0gIm5wcF9ubGltX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiAgIG5icF9lbnNfd2F2ZTAxIDwtICBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCx2YXJpYWJsZSA9ICJuYnBfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKICAgY1NvaWxfZW5zX3dhdmUwMSA8LSAgbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsdmFyaWFibGUgPSAiY1NvaWxfbG5kX3N1bSIpIC8gMWUxMgogICBjVmVnX2Vuc193YXZlMDEgPC0gIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLHZhcmlhYmxlID0gImNWZWdfbG5kX3N1bSIpIC8gMWUxMgogICMgCiAgIyAKICAgbGFpX2xuZF9tZWFuX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsdmFyaWFibGUgPSAibGFpX2xuZF9tZWFuIikKICAjIAogICMgIyBmbHV4ZXMKICAgcmhfbG5kX3N1bV9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLCB2YXJpYWJsZSA9ICJyaF9sbmRfc3VtIikgLyAoMWUxMi95c2VjKQogICBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgdmFyaWFibGUgPSAiZkx1Y19sbmRfc3VtIikgLyAoMWUxMi95c2VjKQogICBmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsIHZhcmlhYmxlID0gImZIYXJ2ZXN0X2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiAgIyAKICAjIAogICMgIyBmcmFjdGlvbnMKICAgdHJlZUZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgIHZhcmlhYmxlID0gInRyZWVGcmFjX2xuZF9tZWFuIikKICAgc2hydWJGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsICB2YXJpYWJsZSA9ICJzaHJ1YkZyYWNfbG5kX21lYW4iKQogICBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgIHZhcmlhYmxlID0gImJhcmVzb2lsRnJhY19sbmRfbWVhbiIpCiAgIAogICAgIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSwgbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCx2YXJpYWJsZSA9ICJjM1BmdEZyYWNfbG5kX21lYW4iKQogIGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSwgbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCx2YXJpYWJsZSA9ICJjNFBmdEZyYWNfbG5kX21lYW4iKQogICAKICAgCiAgCiAgIHNhdmUobnBwX2Vuc193YXZlMDEsCiAgICAgICAgbmJwX2Vuc193YXZlMDEsCiAgICAgICAgY1NvaWxfZW5zX3dhdmUwMSwKICAgICAgICBjVmVnX2Vuc193YXZlMDEsCiAgICAgICAgbGFpX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICAgcmhfbG5kX3N1bV9lbnNfd2F2ZTAxLAogICAgICAgIGZMdWNfbG5kX3N1bV9lbnNfd2F2ZTAxLAogICAgICAgIGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3dhdmUwMSwKICAgICAgICB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLAogICAgICAgIHNocnViRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLAogICAgICAgIGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLAogICAgICAgIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLAogICAgICAgIGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLAogICAgICAgZmlsZSA9ICJlbnNlbWJsZV90aW1lc2VyaWVzX3dhdmUwMV8yMDIyLTA0LTA4LnJkYXRhIiApCn0KCiN0b3RhbF9sYW5kX2NhcmJvbl9lbnNfd2F2ZTAxIDwtIGNTb2lsX2Vuc193YXZlMDEgKyBjVmVnX2Vuc193YXZlMDEKCmBgYAoKCgojIyB0aW1lc2VyaWVzIG91dGxpZXJzCgpUaW1lc2VyaWVzIHRoYXQgaGF2ZSBwcm9ibGVtcy4gTkJQLCBSSCBhbmQgY1NvaWwgc2VlbXMgdG8gaGF2ZSBsYXJnZSBvdXRsaWVycwpgYGB7cn0KCiMgVGhlc2UgaW5kaWNlcyByZWZlcmVuY2UgdGhlIHNlcGFyYXRlIGVuc2VtYmxlcwojIGNTb2lsIG92ZXIgNjAwMAojIHJoIG92ZXIgMjAwCiMgbmJwIGxlc3MgdGhhbiAtMTUKY1NvaWxfb3V0bGllcl9peF93YXZlMDAgPC0gdW5pcXVlKHdoaWNoKGNTb2lsX2VucyA+IDYwMDAsIGFyci5pbmQgPSBUUlVFKVssJ3JvdyddKQpjU29pbF9vdXRsaWVyX2l4X3dhdmUwMSA8LSB1bmlxdWUod2hpY2goY1NvaWxfZW5zX3dhdmUwMSA+IDYwMDAsIGFyci5pbmQgPSBUUlVFKVssJ3JvdyddKQoKbmJwX291dGxpZXJfaXhfd2F2ZTAwIDwtIHVuaXF1ZSh3aGljaChuYnBfZW5zIDwgLTE1LCBhcnIuaW5kID0gVFJVRSlbLCdyb3cnXSkKbmJwX291dGxpZXJfaXhfd2F2ZTAxIDwtIHVuaXF1ZSh3aGljaChuYnBfZW5zX3dhdmUwMSA8IC0xNSwgYXJyLmluZCA9IFRSVUUpWywncm93J10pCgpyaF9sbmRfc3VtX291dGxpZXJfaXhfd2F2ZTAwIDwtIHVuaXF1ZSh3aGljaChyaF9sbmRfc3VtX2VucyA+IDIwMCwgYXJyLmluZCA9IFRSVUUpWywncm93J10pCnJoX2xuZF9zdW1fb3V0bGllcl9peF93YXZlMDEgPC0gdW5pcXVlKHdoaWNoKHJoX2xuZF9zdW1fZW5zX3dhdmUwMSA+IDIwMCwgYXJyLmluZCA9IFRSVUUpWywncm93J10pCgoKIyBhcmUgdGhlcmUgYWRkaXRpb25hbCBleGNsdWRlZCBpbmRpY2VzIHRvIHRob3NlIGFscmVhZHkgZXhjbHVkZWQgYnkgdGhlIGNvbnN0cmFpbnQKCndhdmUwMV9hbGxfaXggPC0gMTpudHJhaW5fd2F2ZTAxCgojIEluZGljZXMgZXhjbHVkZWQgaW4gd2F2ZTAxIGxldmVsMgpsZXZlbDJfbml4X3dhdmUwMSA8LSBzZXRkaWZmKHdhdmUwMV9hbGxfaXgsIGxldmVsMl9peF93YXZlMDEpCgojIHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHNlZSBpZiB0aGVzZSBsb29rIG5vcm1hbCBpbiBvdGhlciB3YXlzCnRzX291dGxpZXJzX2l4X3dhdmUwMSA8LSB1bmlxdWUoYyhjU29pbF9vdXRsaWVyX2l4X3dhdmUwMSxuYnBfb3V0bGllcl9peF93YXZlMDEsIHJoX2xuZF9zdW1fb3V0bGllcl9peF93YXZlMDEpKQojIGFyZSB0aGVyZSBhbnkgdGhhdCBhcmUgbm90IGV4Y2x1ZGVkIGJ5IGxldmVsIDI/IChJIGFzc3VtZSBzbykKaW50ZXJzZWN0KHRzX291dGxpZXJzX2l4X3dhdmUwMSwgbGV2ZWwyX25peF93YXZlMDEpCgp3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSA8LSBzZXRkaWZmKHdhdmUwMV9hbGxfaXgsdHNfb3V0bGllcnNfaXhfd2F2ZTAxKQoKIyBSZW1vdmUgdGhlc2UgZnJvbSB0aGUgd2F2ZTAxIGVuc2VtYmxlIHRvIHJlbW92ZSBvdXRsaWVycyBhbmQgZXhjbHVkZWQgZW5zZW1ibGUgbWVtYmVycwpsZXZlbDJfYW5kX3RzX291dGxpZXJzX25peF93YXZlMDEgPC0gdW5pb24obGV2ZWwyX25peF93YXZlMDEsIHRzX291dGxpZXJzX2l4X3dhdmUwMSkKCmxldmVsMmFfaXhfd2F2ZTAxIDwtIHNldGRpZmYod2F2ZTAxX2FsbF9peCwgbGV2ZWwyX2FuZF90c19vdXRsaWVyc19uaXhfd2F2ZTAxKQoKd2F2ZTAwX2FsbF9peCA8LSAxOjQ5OQp0c19vdXRsaWVyc19peF93YXZlMDAgPC0gdW5pcXVlKGMoY1NvaWxfb3V0bGllcl9peF93YXZlMDAsbmJwX291dGxpZXJfaXhfd2F2ZTAwLCByaF9sbmRfc3VtX291dGxpZXJfaXhfd2F2ZTAwKSkKd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAgPC0gc2V0ZGlmZih3YXZlMDBfYWxsX2l4LHRzX291dGxpZXJzX2l4X3dhdmUwMCkKCmBgYAoKCgpgYGB7ciBwbG90LWNhcmJvbi1jeWNsZS10aW1lc2VyaWVzLXByaW1hcnksIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9CgpsY29sX3dhdmUwIDwtIG1ha2VUcmFuc3BhcmVudCgnZG9kZ2VyYmx1ZTInLCAgMTIwKQpsY29sX3dhdmUwMSA8LSBtYWtlVHJhbnNwYXJlbnQoJ2ZpcmVicmljaycsICAxMjApCmxjb2xfd2F2ZTAxX2xldmVsMiA8LSAnZ29sZCcKc3RhbmNvbCA9ICdibGFjaycKCmxpbmVQbG90TXVsdGlFbnMgPC0gZnVuY3Rpb24oeWVhcnMsIGVuczEsIGVuczIsIGVuczMsIGNvbDEsIGNvbDIsIGNvbDMsIHlsYWIsIG1haW4sIHlsaW0gPSBOVUxMKXsKICAjIFBsb3Qgd2F2ZTAwIGFuZCB3YXZlMDEgdGltZXNlcmllcyBvbiB0b3Agb2Ygb25lIGFub3RoZXIKICAKICBudCA8LSBsZW5ndGgoeWVhcnMpIAogIGlmKGlzLm51bGwoeWxpbSkpewogICAgCiAgeWxpbSA9IHJhbmdlKGMoZW5zMVssMV0sIGVuczFbLG50XSwgZW5zMlssMV0sIGVuczJbICxudF0sIGVuczNbLDFdLCBlbnMzWywgbnRdKSkKICB9CiAgCiAgZWxzZSB5bGltIDwtIHlsaW0KICAKICBtYXRwbG90KHllYXJzLCB0KGVuczEpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBjb2wxLAogICAgICAgIHlsYWIgPSB5bGFiLCBtYWluID0gbWFpbiwgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJykKICBtYXRsaW5lcyh5ZWFycywgdChlbnMyKSwgY29sID0gY29sMiwgbHR5ID0gJ3NvbGlkJykKICAgIG1hdGxpbmVzKHllYXJzLCB0KGVuczMpLCBjb2wgPSBjb2wzLCBsdHkgPSAnc29saWQnKQp9CgojcGRmKGZpbGUgPSAnZmlncy9jYXJib24tY3ljbGUtdGltZXNlcmllcy13YXZlcy1jb25zdHJhaW5lZC5wZGYnLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMikKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMCkpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBucHBfZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5wcF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5wcF9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05QUCcpCgpsaW5lcyh5ZWFycyxucHBfc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9ICBuYnBfZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIAogICAgICAgICAgICAgICAgIGVuczIgPSBuYnBfZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBuYnBfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05CUCcsIHlsaW0gPSBjKC0xMCwxMCkpCgpsaW5lcyh5ZWFycywgbmJwX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBjU29pbF9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1NvaWxfZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjU29pbF9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2NTb2lsJywgeWxpbSA9IHJhbmdlKGMoY1NvaWxfZW5zWywxXSwgY1NvaWxfZW5zWywxNjRdKSkpCgpsaW5lcyh5ZWFycywgY1NvaWxfc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNWZWdfZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGNWZWdfZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjVmVnX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZycpCgpsaW5lcyh5ZWFycywgY1ZlZ19zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gbGFpX2xuZF9tZWFuX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdMYWknKQoKbGluZXMoeWVhcnMsIGxhaV9sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gcmhfbG5kX3N1bV9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gcmhfbG5kX3N1bV9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IHJoX2xuZF9zdW1fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCAgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnUkgnKQoKbGluZXMoeWVhcnMsIHJoX2xuZF9zdW1fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZMdWNfbG5kX3N1bV9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gZkx1Y19sbmRfc3VtX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkx1Y19sbmRfc3VtX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkx1YycpCgpsaW5lcyh5ZWFycywgZkx1Y19sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2ZIYXJ2ZXN0JykKCmxpbmVzKHllYXJzLCBmSGFydmVzdF9sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICd0cmVlZnJhYycKICAgICAgICAgICAgICAgICApCgpsaW5lcyh5ZWFycywgdHJlZUZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc1tsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnc2hydWJmcmFjJwopCgpsaW5lcyh5ZWFycywgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdiYXJlc29pbGZyYWMnKQoKbGluZXMoeWVhcnMsIGJhcmVzb2lsRnJhY19sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjM1BmdEZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2MzUGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUsIGNvbCA9IGMobGNvbF93YXZlMCwgbGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiwgc3RhbmNvbCksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgojZGV2Lm9mZigpCmBgYApUaGlzIGlzIGEgcGxvdCBvZiB0aW1lc2VyaWVzIG9mIFdhdmUwMCwgV2F2ZTAxLCBhbmQgbGV2ZWwyLWNvbnN0cmFpbmVkIHdhdmUwMSBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIFdlIHNlZSB0aGF0IHRoZSB3YXZlMDEgaXMgY2xvc2VyIHRvIHRoZSBzdGFuZGFyZCB0aGFuIHdhdmUwMCwgYW5kIHRoZSBsZXZlbC0yIGNvbnN0cmFpbmVkIHdhdmUwMSBlbnNlbWJsZSBpcyBvZnRlbiBjbG9zZXIgYWdhaW4uIEhvd2V2ZXIsIHRoZXJlIGFyZSBzdGlsbCBxdWl0ZSBsYXJnZSBkaXNjcmVwYW5jaWVzLiBGb3IgZXhhbXBsZSwgYmFyZXNvaWxmcmFjIGlzIG9mdGVuIHdheSB0b28gaGlnaCwgc2hydWJmcmFjIGlzIG9mdGVuIHRvbyBsb3cgKHRob3VnaCBib3RoIHRoZXNlIHNwYW4gdGhlIHN0YW5kYXJkKS4gVHJlZWZyYWMgaXMgYXdheSBmcm9tIHplcm8sIGJ1dCBzdGlsbCBvZnRlbiB0b28gbG93IG9yIHRvbyBoaWdoLiBXaGlsZSBmSGFydmVzdCBsb29rcyBnb29kLCBmTHVjIGRvZXMgbm90IGFwcGVhciBjb25zdHJhaW5lZCBieSB0aGUgcHJvY2VzcyBhdCBhbGwuIFJIIChzb2lsIHJlc3BpcmF0aW9uKSBsb29rcyB3ZWxsIGNvbnN0cmFpbmVkLCB3aGVyZWFzIGxhaSBpcyBvZnRlbiB0b28gbG93LiAgCgpPbmUgdGhpbmcgd2UgY291bGQgZG8gbmV4dCBpcyBjb25zdHJhaW4gaW5wdXQgc3BhY2UgYWdhaW4sIHVzaW5nIG9ic2VydmF0aW9ucyBvciAidG9sZXJhbmNlIHRvIGVycm9yIiBvbiBzb21lIG9yIGFsbCBvZiB0aGVzZSBvdXRwdXRzLiAgCgpXZSBjb3VsZCBhbHNvIGV4dGVuZCBzZW5zaXRpdml0eSBhbmFseXNpcyB0byB3b3JrIG91dCB3aGF0IGNvbnRyb2xzIGUuZy4gdHJlZWZyYWMuCgpBIHN1bW1hcnkgb2Ygd2hhdCBnZXRzIGNvbnN0cmFpbmVkIHdoZW4geW91IGNvbnN0cmFpbiB0aGUgdG9wLWxldmVsIHZhcmlhYmxlcyB3b3VsZCBiZSBhIHVzZWZ1bCBhYW5hbHlzaXMuCgoKIyMgQW5vbWFseSB0aW1lc2VyaWVzCgpTaW1pbGFyIHRvIGFib3ZlLCBidXQgb3V0cHV0IGFub21hbHkKYGBge3J9Cm5wcF9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgobnBwX2Vuc193YXZlMDEsIDE6MjApCm5icF9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgobmJwX2Vuc193YXZlMDEsIDE6MjApCmNTb2lsX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChjU29pbF9lbnNfd2F2ZTAxLCAxOjIwKQpjVmVnX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChjVmVnX2Vuc193YXZlMDEsIDE6MjApCgpyaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChyaF9sbmRfc3VtX2Vuc193YXZlMDEsIDE6MjApCmZMdWNfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgoZkx1Y19sbmRfc3VtX2Vuc193YXZlMDEsIDE6MjApCmxhaV9sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgobGFpX2xuZF9tZWFuX2Vuc193YXZlMDEsIDE6MjApIAoKZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgoZkhhcnZlc3RfbG5kX3N1bV9lbnNfd2F2ZTAxLCAxOjIwKQp0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDEgPC0gYW5vbWFsaXplVFNtYXRyaXgodHJlZUZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkKc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkKYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkKYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkKYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkKCiN0b3RhbF9sYW5kX2NhcmJvbl9hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeCh0b3RhbF9sYW5kX2NhcmJvbl9lbnNfd2F2ZTAxLCAxOjIwKQoKCgoKCmBgYAoKYGBge3J9Cgphbm9tYWxpemVUUyA8LSBmdW5jdGlvbih4LCBpeCA9IDE6MjApe3ggLSBtZWFuKHhbaXhdKSB9IApucHBfc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKG5wcF9zdGFuKQoKbmJwX3N0YW5fYW5vbSA8LSBhbm9tYWxpemVUUyhuYnBfc3RhbikKY1NvaWxfc3Rhbl9hbm9tIDwtYW5vbWFsaXplVFMoY1NvaWxfc3RhbikKY1ZlZ19zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoY1ZlZ19zdGFuKQpsYWlfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKGxhaV9sbmRfbWVhbl9zdGFuKQoKCiMgZmx1eGVzCnJoX2xuZF9zdW1fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKHJoX2xuZF9zdW1fc3RhbikKZkx1Y19sbmRfc3VtX3N0YW5fYW5vbSA8LSBhbm9tYWxpemVUUyhmTHVjX2xuZF9zdW1fc3RhbikKZkhhcnZlc3RfbG5kX3N1bV9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoZkhhcnZlc3RfbG5kX3N1bV9zdGFuKQoKCiMgZnJhY3Rpb25zCnRyZWVGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSA8LSBhbm9tYWxpemVUUyh0cmVlRnJhY19sbmRfbWVhbl9zdGFuKQpzaHJ1YkZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKHNocnViRnJhY19sbmRfbWVhbl9zdGFuKQpiYXJlc29pbEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKGJhcmVzb2lsRnJhY19sbmRfbWVhbl9zdGFuKQpjM1BmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKGMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuKQpjNFBmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKGM0UGZ0RnJhY19sbmRfbWVhbl9zdGFuKQpgYGAKCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9CgoKI3BkZihmaWxlID0gJ2ZpZ3MvY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtYW5vbWFseS13YXZlcy1jb25zdHJhaW5lZC5wZGYnLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMikKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMCkpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBucHBfZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gbnBwX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBucHBfZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05QUCcpCgpsaW5lcyh5ZWFycyxucHBfc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSAgbmJwX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIAogICAgICAgICAgICAgICAgIGVuczIgPSBuYnBfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5icF9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSxjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOQlAnLCB5bGltID0gYygtMTAsMTApKQoKbGluZXMoeWVhcnMsIG5icF9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBjU29pbF9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjU29pbF9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gY1NvaWxfZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2NTb2lsJywgeWxpbSA9IHJhbmdlKGMoY1NvaWxfZW5zX2Fub21bLDFdLCBjU29pbF9lbnNfYW5vbVssMTY0XSkpKQoKbGluZXMoeWVhcnMsIGNTb2lsX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNWZWdfZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1ZlZ19lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gY1ZlZ19lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZycpCgpsaW5lcyh5ZWFycywgY1ZlZ19zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBsYWlfbG5kX21lYW5fZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gbGFpX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBsYWlfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ0xhaScpCgpsaW5lcyh5ZWFycywgbGFpX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IHJoX2xuZF9zdW1fZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gcmhfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gcmhfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1JIJykKCmxpbmVzKHllYXJzLCByaF9sbmRfc3VtX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZMdWNfbG5kX3N1bV9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmTHVjX2xuZF9zdW1fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGZMdWNfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkx1YycpCgpsaW5lcyh5ZWFycywgZkx1Y19sbmRfc3VtX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkhhcnZlc3QnKQoKbGluZXMoeWVhcnMsIGZIYXJ2ZXN0X2xuZF9zdW1fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAndHJlZWZyYWMnCiAgICAgICAgICAgICAgICAgKQoKbGluZXMoeWVhcnMsIHRyZWVGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnc2hydWJmcmFjJwopCgpsaW5lcyh5ZWFycywgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2JhcmVzb2lsZnJhYycpCgpsaW5lcyh5ZWFycywgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjM1BmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2MzUGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzNQZnRGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2MzUGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCd3YXZlMDEnLCd3YXZlMDEgbGV2ZWwyJywnc3RhbmRhcmQnKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41LCBjb2wgPSBjKGxjb2xfd2F2ZTAsIGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDIsIHN0YW5jb2wpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKCiNkZXYub2ZmKCkKCmBgYAoKCgoKIyBFbXVsYXRvciBmaXRzCgpXZSBob3BlIHRoYXQgcnVubmluZyB0aGUgbmV3IGVuc2VtYmxlIGdpdmVzIHVzIGEgYmV0dGVyIGVtdWxhdG9yLCBhbmQgYWxsb3dzIHVzIHRvIHJ1bGUgb3V0IG1vcmUgaW5wdXQgc3BhY2UuCldlIHBhcnRpY3VsYXJseSBob3BlIHRoYXQgdGhlIGVtdWxhdG9yIGlzIGJldHRlciBmb3IgdGhvc2UgbWVtYmVycyB0aGF0IGFyZSBpbnNpZGUgQVcncyBjb25zdHJhaW50cy4KCkZpcnN0LCB3ZSBjYW4gbG9vayBhdCB0aGUgZW11bGF0b3IgZXJyb3JzIGluIHR3byBjYXNlczogVGhlIGxldmVsMWEgZGF0YSAoYSBiYXNpYyBjYXJib24gY3ljbGUpLCBhbmQgdGhlbiB3aXRoIHRoZSBXYXZlMDEgZGF0YSwgd2hpY2ggc2hvdWxkIGhhdmUgc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MuIChXZSBzaG91bGQgaGF2ZSBlbGltaW5hdGVkIHJlYWxseSBiYWQgc2ltdWxhdGlvbnMsIGJ1dCB3YXZlMDEgaXMgbm90IGNvbnN0cmFpbmVkIHRoZSBkYXRhIHBlcmZlY3RseSB0byBiZSB3aXRoaW4gQVcgY29uc3RyYWludHMuKQoKCmBgYHtyfQojIyBFbXVsYXRvciBmaXQgbGlzdCBvZiBsZXZlbCAxYSBlbnNlbWJsZQoKI2ZpdF9saXN0X2NvbnN0X2xldmVsMWEgPC0gY3JlYXRlS21GaXRMaXN0KFggPSBYX2xldmVsMWEsIFkgPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkKQoKWV9jb25zdF9sZXZlbDFhX3NjYWxlZF9saXN0IDwtIG1hdDJsaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgpmaXRfbGlzdF9jb25zdF9sZXZlbDFhIDwtIG1jbGFwcGx5KFggPSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkX2xpc3QsIEZVTiA9IGttLCBmb3JtdWxhID0gfi4sIGRlc2lnbiA9IFhfbGV2ZWwxYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYy5jb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KHRyYWNlID0gRkFMU0UpKQoKCgoKYGBgCgoKCmBgYHtyfQojIyBSZW1vdmUgYW55ICB0aW1lc2VyaWVzIG91dGxpZXJzIGZyb20gdGhlIG5ldyB3YXZlIGFuZCBidWlsZCBlbXVsYXRvcnMKIyBCaW5kIHRvZ2V0aGVyIHRoZSBpbnB1dCBtYXRyaWNlcyBhbmQgc2NhbGVkIG91dHB1dCBkYXRhCgoKI1hfbGV2ZWwxYV93YXZlMDEgPC0gcmJpbmQoWF9sZXZlbDFhLCBYX3dhdmUwMV90cmFpbilbLTQ0MCwgXQpYX2xldmVsMWFfd2F2ZTAxIDwtIHJiaW5kKFhfbGV2ZWwxYSwgWF93YXZlMDFfdHJhaW5bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsIF0pCgpZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZCA8LSByYmluZChZX2NvbnN0X2xldmVsMWFfc2NhbGVkLCBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsIF0pCgoKI2FwcGx5KFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkICwyLCB3aGljaC5tYXgpCiNhcHBseShZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZCAsMiwgd2hpY2gubWluKQpgYGAKCgpGb3VuZCB0aGUgb3V0bGllciAtIGxvb2tzIGxpa2UgaXQncyA0NDAKYGBge3J9CgpmaW5kT3V0bGllcnMgPC0gZnVuY3Rpb24oeCwgc2RzID0gNil7CiAgCiAgaXggPC0gd2hpY2goYWJzKHggLSBtZWFuKHgpKSA+IChzZHMgKiBzZCh4KSkpCiAgCn0KCmFwcGx5KFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkICwyLCBmaW5kT3V0bGllcnMsIHNkcyA9IDEwKQpgYGAKCgpgYGB7cn0KIyBDcmVhdGUgZml0IGxpc3RzIGZvciB0aGUgY29tYmluZWQgZGF0YQpZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9saXN0IDwtIG1hdDJsaXN0KFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkKQoKZml0X2xpc3RfY29uc3RfbGV2ZWwxYV93YXZlMDEgPC0gbWNsYXBwbHkoWCA9IFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX2xpc3QgLCBGVU4gPSBrbSwgZm9ybXVsYSA9IH4uLCBkZXNpZ24gPSBYX2xldmVsMWFfd2F2ZTAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QodHJhY2UgPSBGQUxTRSkpCgoKYGBgCgojIyBMZWF2ZS1vbmUtb3V0IGFuYWx5c2VzIG9mIGVtdWxhdG9yIHByZWRpY3Rpb24gYWNjdXJhY3kKCmBgYHtyfQoKbG9vbGlzdF9rbV9ZX2xldmVsMWEgPC0gbWNsYXBwbHkoWCA9IGZpdF9saXN0X2NvbnN0X2xldmVsMWEsIEZVTiA9IGxlYXZlT25lT3V0LmttLCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCgpsb29saXN0X2ttX1lfbGV2ZWwxYV93YXZlMDEgPC0gbWNsYXBwbHkoWCA9IGZpdF9saXN0X2NvbnN0X2xldmVsMWFfd2F2ZTAxLCBGVU4gPSBsZWF2ZU9uZU91dC5rbSwgdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFKQoKYGBgCgoKYGBge3J9Cgpsb29zdGF0c19rbV9ZX2xldmVsMWEgPC0gbGFwcGx5KGZpdF9saXN0X2NvbnN0X2xldmVsMWEsIEZVTiA9IGttTG9vU3RhdHMpCmxvb3N0YXRzX2ttX1lfbGV2ZWwxYV93YXZlMDEgPC0gbGFwcGx5KGZpdF9saXN0X2NvbnN0X2xldmVsMWFfd2F2ZTAxLCBGVU4gPSBrbUxvb1N0YXRzKQoKYGBgCgoKVGhlIHRvcCByb3cgc2hvd3MgdGhlIGxlYXZlLW9uZS1vdXQgcHJlZGljdGlvbiBhY2N1cmFjeSBvZiB0aGUgb3JpZ2luYWwgd2F2ZTAwIGVuc2VtYmxlLCBhbmQgdGhlIGxvd2VyIHJvdyB0aGUgZW50aXJlIHdhdmUwMCBBTkQgd2F2ZTAxIGVuc2VtYmxlIGNvbWJpbmVkLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNn0KCiNwZGYoZmlsZSA9ICdmaWdzL2ttbG9vc3RhdHNfWV9sZXZlbDFhLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpwYXIobWZyb3cgPSBjKDIsNCksIG1hciA9IGMoMyw0LDIsMiksIG9tYSA9IGMoNCw0LDQsMC4xKSkKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWEpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCBpXQogIGxvbyA8LSBsb29saXN0X2ttX1lfbGV2ZWwxYVtbaV1dCiAgeWxpbSA8LSByYW5nZShjKGxvbyRtZWFuIC0gKDIqbG9vJHNkKSwgbG9vJG1lYW4gKyAoMipsb28kc2QpKSApCiAgcGxvdCh5LCBsb28kbWVhbiwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSAnJyAsIHlsaW0gPSB5bGltLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAxMDApLAogICAgICAgcGNoID0gMTkpCiAgc2VnbWVudHMoeDAgPSB5LCB5MCA9IGxvbyRtZWFuIC0gKDIqbG9vJHNkKSAgLCB4MSA9IHkgLCB5MSA9IGxvbyRtZWFuICsgKDIqbG9vJHNkKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgNTApKQogIGFibGluZSgwLDEpCiAgbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMiAgKQogIGxlZ2VuZCgnYm90dG9tcmlnaHQnLGxlZ2VuZCA9IHBhc3RlKCdwbWFlID0nLHJvdW5kKGxvb3N0YXRzX2ttX1lfbGV2ZWwxYVtbaV1dJHBtYWUsMiksJyUnKSAsIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMikKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdMZXZlbCAxYSBlbnNlbWJsZSBvdXRwdXRzJywgc2lkZSA9IDMsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCgojZGV2Lm9mZigpCgojcGRmKGZpbGUgPSAnZmlncy9rbWxvb3N0YXRzX1lfbGV2ZWwxYS5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMikKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWEpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkWywgaV0KICBsb28gPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxW1tpXV0KICB5bGltIDwtIHJhbmdlKGMobG9vJG1lYW4gLSAoMipsb28kc2QpLCBsb28kbWVhbiArICgyKmxvbyRzZCkpICkKICBwbG90KHksIGxvbyRtZWFuLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9ICcnICwgeWxpbSA9IHlsaW0sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDEwMCksCiAgICAgICBwY2ggPSAxOSkKICBzZWdtZW50cyh4MCA9IHksIHkwID0gbG9vJG1lYW4gLSAoMipsb28kc2QpICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW4gKyAoMipsb28kc2QpLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCAxMDApKQogIGFibGluZSgwLDEpCiAgbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMiAgKQogIGxlZ2VuZCgnYm90dG9tcmlnaHQnLGxlZ2VuZCA9IHBhc3RlKCdwbWFlID0nLHJvdW5kKGxvb3N0YXRzX2ttX1lfbGV2ZWwxYV93YXZlMDFbW2ldXSRwbWFlLDIpLCclJykgLCBidHkgPSAnbicsIHRleHQuZm9udCA9IDIpCgp9CgptdGV4dCgnQWN0dWFsJywgc2lkZSA9IDEsIGxpbmUgPSAxLCBvdXRlciA9IFRSVUUsIGNleCA9IDIgKQptdGV4dCgnUHJlZGljdGVkJywgc2lkZSA9IDIsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpIAptdGV4dCgnTGV2ZWwgMWEgZW5zZW1ibGUgb3V0cHV0cycsIHNpZGUgPSAzLCBsaW5lID0gMCwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyKQoKYGBgCgpgYGB7cn0KIyByZW1vdmUgdG8gbGV2ZWwgMWEgUmVsYXRpdmUgdG8gdG9wbGV2ZWxfaXggLSB1c2VmdWwgZm9yIHBsb3R0aW5nIGV0Yy4KI3RvcGxldmVsX3RvX2xldmVsXzFhX2l4IDwtKHRvcGxldmVsX2l4Wy1ZX25sZXZlbDBfaXhdKVtsZXZlbDFhX2l4XQoKIyBTbyBmdXJ0aGVyIGNvbnN0cmFpbmluZyB0byBsZXZlbCAyIGNhbiBiZSBhc3NvY2lhdGVkIGJhY2sgdG8gdGhlIHRvcCBsZXZlbC4KCmxldmVsMl9peCA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSA+IDAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmICBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCAmCiAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAogICAgICAgICAgICAgICAgICAKICApCgpsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDEgPC0gd2hpY2goWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICAgICAgICAgICAgICAgICAgKQoKYGBgCgojIyBFbXVsYXRvciBhY2N1cmFjeSBvZiBtZW1iZXJzIGZyb20gd2F2ZSAwMCBhbmQgd2F2ZSAwMSB0aGF0IHBhc3MgbGV2ZWwgMiAoQVcncykgY29uc3RyYWludHMKCldlIHNlZSB0aGF0IHRoZSBlcnJvciBzdGF0cyBmb3Igc29tZSBvZiB0aGUgb3V0cHV0cyBmcm9tIHdhdmUwMSBhcmUgd29yc2UsIGJ1dCB0aGVyZSBhcmUgbWFueSBtb3JlIGVuc2VtYmxlIG1lbWJlcnMgdGhhdCBsaWUgd2l0aGluIHRoZSBjb25zdHJhaW50cyBmb3Igd2F2ZSAwMS4KCiJwbWFlIiBpcyAicHJvcG9ydGlvbmFsIG1lYW4gYWJzb2x1ZSBlcnJvciIsIHdoaWNoIGlzIHRoZSBtZWFuIGFic29sdXRlIGVycm9yIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIG9yaWdpbmFsIChtaW5pbWFsbHkgY29uc3RyYWluZWQpIGVuc2VtYmxlIHJhbmdlIGluIHRoYXQgb3V0cHV0LiAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9CgojcGRmKGZpbGUgPSAnZmlncy9rbWxvb3N0YXRzX1lfbGV2ZWwxYS5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMikKcGFyKG1mcm93ID0gYygyLDQpLCBtYXIgPSBjKDMsNCwyLDIpLCBvbWEgPSBjKDQsNCw0LDAuMSkpCmZvcihpIGluIDE6bGVuZ3RoKGxvb2xpc3Rfa21fWV9sZXZlbDFhKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2xldmVsMl9peCwgaV0KICBsb28gPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFbW2ldXQogIHlsaW0gPC0gcmFuZ2UoYyhsb28kbWVhbltsZXZlbDJfaXhdIC0gKDIqbG9vJHNkW2xldmVsMl9peF0pLCBsb28kbWVhbltsZXZlbDJfaXhdICsgKDIqbG9vJHNkW2xldmVsMl9peF0pKSApCiAgcGxvdCh5LCBsb28kbWVhbltsZXZlbDJfaXhdLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9ICcnICwgeWxpbSA9IHlsaW0sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDEwMCksCiAgICAgICBwY2ggPSAxOSkKICBzZWdtZW50cyh4MCA9IHksIHkwID0gbG9vJG1lYW5bbGV2ZWwyX2l4XSAtICgyKmxvbyRzZFtsZXZlbDJfaXhdKSAgLCB4MSA9IHkgLCB5MSA9IGxvbyRtZWFuW2xldmVsMl9peF0gKyAoMipsb28kc2RbbGV2ZWwyX2l4XSksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDEwMCkpCiAgYWJsaW5lKDAsMSkKICBsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyICApCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ3BtYWUgPScscm91bmQobG9vc3RhdHNfa21fWV9sZXZlbDFhW1tpXV0kcG1hZSwyKSwnJScpICwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyKQoKfQoKI2Rldi5vZmYoKQoKI3BkZihmaWxlID0gJ2ZpZ3Mva21sb29zdGF0c19ZX2xldmVsMWEucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCmZvcihpIGluIDE6bGVuZ3RoKGxvb2xpc3Rfa21fWV9sZXZlbDFhKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZFtsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDEsIGldCiAgbG9vIDwtIGxvb2xpc3Rfa21fWV9sZXZlbDFhX3dhdmUwMVtbaV1dCiAgeWxpbSA8LSByYW5nZShjKGxvbyRtZWFuW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0gLSAoMipsb28kc2RbbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSksIGxvbyRtZWFuW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0gKyAoMipsb28kc2RbbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSkpICkKICBwbG90KHksIGxvbyRtZWFuW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMTAwKSwKICAgICAgIHBjaCA9IDE5KQogIHNlZ21lbnRzKHgwID0geSwgeTAgPSBsb28kbWVhbltsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDFdIC0gKDIqbG9vJHNkW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0pICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW5bbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSArICgyKmxvbyRzZFtsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDFdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgNTApKQogIGFibGluZSgwLDEpCiAgbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMiAgKQogIGxlZ2VuZCgnYm90dG9tcmlnaHQnLGxlZ2VuZCA9IHBhc3RlKCdwbWFlID0nLHJvdW5kKGxvb3N0YXRzX2ttX1lfbGV2ZWwxYV93YXZlMDFbW2ldXSRwbWFlLDIpLCclJykgLCBidHkgPSAnbicsIHRleHQuZm9udCA9IDIpCgp9CgptdGV4dCgnQWN0dWFsJywgc2lkZSA9IDEsIGxpbmUgPSAxLCBvdXRlciA9IFRSVUUsIGNleCA9IDIgKQptdGV4dCgnUHJlZGljdGVkJywgc2lkZSA9IDIsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpIAptdGV4dCgnTGV2ZWwgMiBjb25zdHJhaW5lZCBlbnNlbWJsZSBvdXRwdXRzJywgc2lkZSA9IDMsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCgpgYGAKCiMjIERvZXMgdGhlIGVtdWxhdG9yIGltcHJvdmUgaXMgeW91IGxvb2sgYXQgb25seSB0aGUgMzcgbWVtYmVycyB0aGF0IHBhc3MgbGV2ZWwgMiBjb25zdHJhaW50cyBpbiB3YXZlIDAwPwpUaGlzIGdpdmVzIHVzIGFuIGlkZWEgb2YgaG93IGdvb2QgdGhlIGVtdWxhdG9yIGlzIHdoZXJlIGl0IHJlYWxseSBtYXR0ZXJzLCBhbmQgYXMgdGhlIG1lbWJlcnMgYXJlIGNvbnNpc3RlbnQsIGdpdmVzIHVzIGEgZmFpcmVyIGlkZWEgb2Ygd2hldGhlciB0aGUgZW11bGF0b3JzIGhhdmUgaW1wcm92ZWQgd2l0aCBtb3JlIG1lbWJlcnMuCgpHb29kIG5ld3MgaXMsIHRoZSBlbXVsYXRvcnMgYXJlIG1vcmUgYWNjdXJhdGUgZm9yIHdhdmUwMS4KCmBgYHtyfQoKCmttTG9vU3RhdHNTdWJzZXQgPC0gZnVuY3Rpb24gKGttLCBpeCwgdHlwZSA9ICJVSyIpIAp7CiAgIyBDYWxjdWxhdGUgc3VtbWFyeSBzdGF0aXN0aWNzIGZvciBhIHN1YnNldCBvZiB0aGUgbWVtYmVycyBvZiBhIGttIGZpdCBsaXN0CiAgICBsb28gPC0gbGVhdmVPbmVPdXQua20oa20sIHR5cGUgPSB0eXBlLCB0cmVuZC5yZWVzdGltID0gVFJVRSkKICAgIHByZWRkaWZmIDwtIGxvbyRtZWFuW2l4XSAtIGttQHlbaXhdCiAgICBtYWUgPC0gbWVhbihhYnMocHJlZGRpZmYpKQogICAgcm1zZSA8LSBzcXJ0KG1lYW4ocHJlZGRpZmZeMikpCiAgICBtYXhlcnIgPC0gbWF4KHByZWRkaWZmKQogICAgYWJzZGlmZiA8LSBhYnMoZGlmZihyYW5nZShrbUB5KSkpCiAgICBwbWFlIDwtIChtYWUvYWJzZGlmZikgKiAxMDAKICAgIHJldHVybihsaXN0KGxvbyA9IGxvbywgbWFlID0gbWFlLCBwbWFlID0gcG1hZSwgbWF4ZXJyID0gbWF4ZXJyKSkKfQoKCmBgYAoKCmBgYHtyfQoKbG9vbGlzdF9rbV9ZX2xldmVsMWFfbGV2ZWwyIDwtIHJhcHBseShsb29saXN0X2ttX1lfbGV2ZWwxYSwgZiA9IGZ1bmN0aW9uKHgpIHhbbGV2ZWwyX2l4XSwgaG93ID0gImxpc3QiKQoKbG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxX2xldmVsMiA8LSByYXBwbHkobG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxLCBmID0gZnVuY3Rpb24oeCkgeFtsZXZlbDJfaXhdLCBob3cgPSAibGlzdCIpCgoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCiNwZGYoZmlsZSA9ICdmaWdzL2ttbG9vc3RhdHNfWV9sZXZlbDFhLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpwYXIobWZyb3cgPSBjKDIsMiksIG1hciA9IGMoMyw0LDIsMiksIG9tYSA9IGMoNCw0LDQsMC4xKSkKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWFfbGV2ZWwyKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2xldmVsMl9peCwgaV0KICAKICBsb28gPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfbGV2ZWwyW1tpXV0KICB5bGltIDwtIHJhbmdlKGMobG9vJG1lYW4tICgyKmxvbyRzZCksIGxvbyRtZWFuICsgKDIqbG9vJHNkKSkgKQogIHBsb3QoeSwgbG9vJG1lYW4sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMjUwKSwKICAgICAgIHBjaCA9IDE5KQogIGFycm93cyh4MCA9IHksIHkwID0gbG9vJG1lYW4gLSAoMipsb28kc2QpICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW4gKyAoMipsb28kc2QpLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAxNTApICwgIGFuZ2xlID0gOTAsIGNvZGUgPSAzLCBsZW5ndGggPSAwLjAzKQogIAogIHkxIDwtIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkW2xldmVsMl9peCwgaV0KICBsb28gPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxX2xldmVsMltbaV1dCiAgCiAgICBwb2ludHMoeTEsIGxvbyRtZWFuLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9ICcnICwgeWxpbSA9IHlsaW0sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDI1MCksCiAgICAgICBwY2ggPSAxOSkKICBhcnJvd3MoeDAgPSB5LCB5MCA9IGxvbyRtZWFuIC0gKDIqbG9vJHNkKSAgLCB4MSA9IHkgLCB5MSA9IGxvbyRtZWFuICsgKDIqbG9vJHNkKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMjUwKSwgIGFuZ2xlID0gOTAsIGNvZGUgPSAzLCBsZW5ndGggPSAwLjAzKQogIAogIAogIGFibGluZSgwLDEpCiAgbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMiAgKQogIGxlZ2VuZCgnYm90dG9tcmlnaHQnLGxlZ2VuZCA9IHBhc3RlKCdwbWFlID0nLHJvdW5kKGxvb3N0YXRzX2ttX1lfbGV2ZWwxYVtbaV1dJHBtYWUsMiksJyUnKSAsIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMikKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdMZXZlbCAyIHdhdmUgMDAgZW5zZW1ibGUgb3V0cHV0cycsIHNpZGUgPSAzLCBsaW5lID0gMCwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyKQoKcmVzZXQoKQpsZWdlbmQoJ3RvcGxlZnQnLCBwY2ggPSAxOSwgbGVnZW5kID0gYygnd2F2ZTAwJywgJ3dhdmUwMScpLCBjb2wgPSBjKHdhdmUwMGNvbCwgd2F2ZTAxY29sICksIGhvcml6ID0gVFJVRSkKCgpgYGAKClRoZXNlIGxlYXZlLW9uZS1vdXQgcHJlZGljdGlvbiBhY2N1cmFjeSBwbG90cyByYW5rIHRoZSBlbnNlbWJsZSBtZW1iZXJzIGZyb20gbGFyZ2VzdCB1bmRlcnByZWRpY3Rpb24gdG8gbGFyZ2VzdCBvdmVycHJlZGljdGlvbiB1c2luZyB0aGUgd2F2ZTAwIHByZWRpY3Rpb25zLiBBIHBlcmZlY3QgcHJlZGljdGlvbiB3b3VsZCBhcHBlYXIgb24gdGhlIGhvcml6b250YWwgInplcm8iIGxpbmUuCgpNYW55IG9mIHRoZSB3YXZlMDEgcHJlZGljdGlvbnMgYXJlIGNsb3NlciB0byB0aGUgaG9yaXpvbnRhbCBsaW5lLCBhbmQgdGhlcmVmb3JlIG1vcmUgYWNjdXJhdGUgcHJlZGljdGlvbnMuICAKCk5vbmUgb2YgdGhlIHByZWRpY3Rpb25zIGFyZSBvdXRzaWRlIHRoZSB1bmNlcnRhaW50eSBib3VuZHMsIHdoaWNoIHN1Z2dlc3RzIHRoZXkgYXJlIG92ZXJjb25zZXJ2YXRpdmUgKHNob3VsZCBiZSBzbWFsbGVyKS4KCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMH0KCiNwZGYoZmlsZSA9ICdmaWdzL2ttbG9vc3RhdHNfWV9sZXZlbDFhLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpwYXIobWZyb3cgPSBjKDQsMSksIG1hciA9IGMoMyw0LDIsMiksIG9tYSA9IGMoNCw0LDQsMC4xKSkKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWFfbGV2ZWwyKSl7CiAgCiAgeSA8LSBZX2NvbnN0X2xldmVsMWFfc2NhbGVkW2xldmVsMl9peCwgaV0KCiAgbG9vXzAwIDwtIGxvb2xpc3Rfa21fWV9sZXZlbDFhX2xldmVsMltbaV1dCiAgbG9vXzAxIDwtIGxvb2xpc3Rfa21fWV9sZXZlbDFhX3dhdmUwMV9sZXZlbDJbW2ldXQogIAogIHByZWRkaWZmX3dhdmUwMCA8LSB5IC0gbG9vXzAwJG1lYW4KICBwcmVkZGlmZl93YXZlMDEgPC0geSAtIGxvb18wMSRtZWFuCiAgCiAgICAjIHJhbmsgYnkgdGhlIG9yaWdpbmFsIHdhdmUgMDAgcHJlZGljdGlvbnMKICBsb29fcmFua19peCA8LSBzb3J0KHByZWRkaWZmX3dhdmUwMCAsIGluZGV4LnJldHVybiA9IFRSVUUpCiAgCiAgIHlsaW0gPC0gcmFuZ2UoYyhwcmVkZGlmZl93YXZlMDBbbG9vX3JhbmtfaXgkaXhdIC0gKDIqbG9vXzAwJHNkW2xvb19yYW5rX2l4JGl4XSksCiAgICAgICAgICAgICAgICAgICBwcmVkZGlmZl93YXZlMDBbbG9vX3JhbmtfaXgkaXhdICsgKDIqbG9vXzAwJHNkW2xvb19yYW5rX2l4JGl4XSksCiAgICAgICAgICAgICAgICAgICBwcmVkZGlmZl93YXZlMDFbbG9vX3JhbmtfaXgkaXhdIC0gKDIqbG9vXzAxJHNkW2xvb19yYW5rX2l4JGl4XSksCiAgICAgICAgICAgICAgICAgICBwcmVkZGlmZl93YXZlMDFbbG9vX3JhbmtfaXgkaXhdICsgKDIqbG9vXzAxJHNkW2xvb19yYW5rX2l4JGl4XSkKICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICApCiAgIAogICBwbG90KHByZWRkaWZmX3dhdmUwMFtsb29fcmFua19peCRpeF0sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAyNTUpLAogICAgICAgIHBjaCA9IDE5LCB5bGltID0geWxpbSkKICAgCiAgIGFibGluZShoID0gMCkKICAgCiAgYXJyb3dzKHgwID0gMTpsZW5ndGgoeSksIHkwID0gcHJlZGRpZmZfd2F2ZTAwW2xvb19yYW5rX2l4JGl4XSAtICgyKmxvb18wMCRzZFtsb29fcmFua19peCRpeF0pICAsIHgxID0gMTpsZW5ndGgoeSkgLCB5MSA9IHByZWRkaWZmX3dhdmUwMFtsb29fcmFua19peCRpeF0gKyAoMipsb29fMDAkc2RbbG9vX3JhbmtfaXgkaXhdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMTUwKSwgIGFuZ2xlID0gOTAsIGNvZGUgPSAzLCBsZW5ndGggPSAwLjAzKQogICAKICBwb2ludHMocHJlZGRpZmZfd2F2ZTAxW2xvb19yYW5rX2l4JGl4XSwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSAnJyAsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDI1NSksCiAgICAgICAgcGNoID0gMTkpCiAgCiAgICBhcnJvd3MoeDAgPSAxOmxlbmd0aCh5KSwgeTAgPSBwcmVkZGlmZl93YXZlMDFbbG9vX3JhbmtfaXgkaXhdIC0gKDIqbG9vXzAxJHNkW2xvb19yYW5rX2l4JGl4XSkgICwgeDEgPSAxOmxlbmd0aCh5KSAsIHkxID0gcHJlZGRpZmZfd2F2ZTAxW2xvb19yYW5rX2l4JGl4XSArICgyKmxvb18wMSRzZFtsb29fcmFua19peCRpeF0pLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCAxNTApLCBhbmdsZSA9IDkwLCBjb2RlID0gMywgbGVuZ3RoID0gMC4wMykKICAgCiAgIG10ZXh0KGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpW2ldLCBzaWRlID0gMywgYWRqID0gMCwgbGluZSA9IDEpCiAgCgp9CgoKIHJlc2V0KCkKIGxlZ2VuZCgndG9wbGVmdCcsIHBjaCA9IDE5LCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJyksIGNvbCA9IGMod2F2ZTAwY29sLCB3YXZlMDFjb2wgKSwgaG9yaXogPSBUUlVFKQoKYGBgCgoKYGBge3J9Cgpsb29zdGF0c19rbV9ZX2xldmVsMWFfc3ViIDwtIGxhcHBseShmaXRfbGlzdF9jb25zdF9sZXZlbDFhLCBGVU4gPSBrbUxvb1N0YXRzU3Vic2V0LCBpeCA9IGxldmVsMl9peCkKbG9vc3RhdHNfa21fWV9sZXZlbDFhX3dhdmUwMV9zdWIgPC0gbGFwcGx5KGZpdF9saXN0X2NvbnN0X2xldmVsMWFfd2F2ZTAxLCBGVU4gPSBrbUxvb1N0YXRzU3Vic2V0LCBpeCA9IGxldmVsMl9peCkKCmBgYAoKTG9va2luZyBhdCB0aGUgcHJvcG9ydGlvbmFsIG1lYW4gYWJzb2x1dGUgZXJyb3IgKHBtYWUpLCBleHByZXNzZWQgaW4gcGVyY2VudCwgd2UgY2FuIHNlZSB0aGF0IGl0IGRvZXNuJ3QgaW1wcm92ZSBtdWNoIGZvciB0aGUgd2hvbGUgZW5zZW1ibGUsIGJ1dCAqZG9lcyogaW1wcm92ZSBzaWduaWZpY2FudGx5IGZvciB0aGUgc3Vic2V0IG9mIGVuc2VtYmxlIG1lbWJlcnMgdGhhdCBmYWxsIHdpdGhpbiBBVydzIGNvbnN0cmFpbnRzIGZyb20gdGhlIGZpcnN0IGVuc2VtYmxlIChtYXJrZWQgIl9zdWIiKS4KCmBgYHtyLCBlY2hvID0gVFJVRX0KCnBtYWVfd2F2ZTAwIDwtIGxhcHBseShsb29zdGF0c19rbV9ZX2xldmVsMWEsIEZVTiA9IGZ1bmN0aW9uKHgpIHgkcG1hZSApCnBtYWVfd2F2ZTAxIDwtIGxhcHBseShsb29zdGF0c19rbV9ZX2xldmVsMWFfd2F2ZTAxLCBGVU4gPSBmdW5jdGlvbih4KSB4JHBtYWUgKQoKcG1hZV93YXZlMDBfc3ViIDwtIGxhcHBseShsb29zdGF0c19rbV9ZX2xldmVsMWFfc3ViLCBGVU4gPSBmdW5jdGlvbih4KSB4JHBtYWUgKQpwbWFlX3dhdmUwMV9zdWIgPC0gbGFwcGx5KGxvb3N0YXRzX2ttX1lfbGV2ZWwxYV93YXZlMDFfc3ViLCBGVU4gPSBmdW5jdGlvbih4KSB4JHBtYWUgKQoKcG1hZV90YWJsZSA8LSBjYmluZChwbWFlX3dhdmUwMCwgcG1hZV93YXZlMDEsIHBtYWVfd2F2ZTAwX3N1YiwgcG1hZV93YXZlMDFfc3ViKQoKcHJpbnQocG1hZV90YWJsZSkKCmBgYAoKIyBDb21wYXJpbmcgYXRtb3NwaGVyaWMgZ3Jvd3RoIGluIHdhdmUwMCwgd2F2ZTAxIGFuZCBvYnNlcnZhdGlvbnMKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCA8LSByZWFkX2V4Y2VsKCdHbG9iYWxfQ2FyYm9uX0J1ZGdldF8yMDIwdjEuMC54bHN4Jywgc2hlZXQgPSAiSGlzdG9yaWNhbCBCdWRnZXQiLCBza2lwID0gMTUsIG5fbWF4ID0gMjcwKQoKcmVzaWQgPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYCAtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb25gCgpyZXNpZF9peCA8LSB3aGljaChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciAlaW4lIHllYXJzKQoKbmVnX2FnIDwtIHN3ZWVwKG5icF9lbnMsIDIsIHJlc2lkW3Jlc2lkX2l4XSwgRlVOID0gJysnKQoKCm1hdHBsb3QoeWVhcnMsIHQoLW5lZ19hZyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IGMoMCwgOCksIGNvbCA9IHdhdmUwMGNvbCwgCiAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdhdG1vc3BoZXJpYyBncm93dGgnLCB4bGFiID0gJycsCiAgICAgICAgIGJ0eSA9ICduJywgeGxpbSA9IGMoMTk2MCwgMjAyMCkpCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBhdG1vc3BoZXJpYyBncm93dGhgLCBjb2wgPSAncmVkJykKCgpgYGAKCiMjIE5lZWQgdG8gcmVtb3ZlIFRpbWVzZXJpZXMgb3V0bGllcnMgaGVyZQoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNn0KCm9ic2NvbCA9ICdwdXJwbGUnCndhdmUwMV9sZXZlbDJjb2wgPC0gJ2dvbGQnCgphZyA8LSBtYXRyaXgobnJvdyA9IG5yb3cobmJwX2VucyksIG5jb2wgPSBuY29sKG5icF9lbnMpKQoKYWcwMSA8LSBtYXRyaXgobnJvdyA9IG5yb3cobmJwX2Vuc193YXZlMDEpLCBuY29sID0gbmNvbChuYnBfZW5zX3dhdmUwMSkpCgpmb3IoaSBpbiAxOm5yb3cobmJwX2VucykpewogIAphZ1tpLCBdIDwtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb25gW3Jlc2lkX2l4XSAtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgb2NlYW4gc2lua2BbcmVzaWRfaXhdIC0gIG5icF9lbnNbaSwgXQogIAp9CgoKZm9yKGkgaW4gMTpucm93KG5icF9lbnNfd2F2ZTAxKSl7CmFnMDFbaSwgXSA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGZvc3NpbCBlbWlzc2lvbnMgZXhjbHVkaW5nIGNhcmJvbmF0aW9uYFtyZXNpZF9peF0gLSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYG9jZWFuIHNpbmtgW3Jlc2lkX2l4XSAtICBuYnBfZW5zX3dhdmUwMVtpLCBdCiAgCn0KCmFnX3N0YW4gPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmBbcmVzaWRfaXhdIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYFtyZXNpZF9peF0gLSAgbmJwX3N0YW4KCiNwZGYod2lkdGggPSA4LCBoZWlnaHQgPSA2LCBmaWxlID0gJ2FnLnBkZicpCm1hdHBsb3QoeWVhcnMsIHQoYWdbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsIF0pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSBjKC0yLCAxMCksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTAwKSwgCiAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdhdG1vc3BoZXJpYyBncm93dGgnLCB4bGFiID0gJycsCiAgICAgICAgIGJ0eSA9ICduJywgeGxpbSA9IGMoMTk2MCwgMjAxMykpCgptYXRsaW5lcyh5ZWFycywgdChhZzAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLCBdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwxMDApLCBsdHkgPSAnc29saWQnKQoKbWF0bGluZXMoeWVhcnMsIHQoYWcwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFfbGV2ZWwyY29sLCAxMDApICwgbHR5ID0gJ3NvbGlkJykKCmxpbmVzKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyLCBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGAsIGNvbCA9IG9ic2NvbCwgbHdkID0yKQoKbGluZXMoeWVhcnMsIGFnX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9MikKCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJywgJ3dhdmUwMSBjb25zdHJhaW5lZCcsICdzdGFuZGFyZCcsICdHQ0InKSwgY29sID0gYyh3YXZlMDBjb2wsIHdhdmUwMWNvbCwgd2F2ZTAxX2xldmVsMmNvbCwgc3RhbmNvbCwgb2JzY29sKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKI2Rldi5vZmYoKQoKYGBgCgoKIyMgQW5keSBhc2tzIC0gd2hhdCBjb25zdHJhaW50IGRvZXMgdGhhdCBnaXZlIHVzIGluIGN1bXVsYXRpdmUgTkJQPwoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQoKY3VtdWxhdGl2ZV9uYnBfZW5zIDwtIHQoYXBwbHkobmJwX2VucywgMSwgY3Vtc3VtKSkKCmN1bXVsYXRpdmVfbmJwX2Vuc193YXZlMDEgPC0gdChhcHBseShuYnBfZW5zX3dhdmUwMSwgMSwgY3Vtc3VtKSkKCmN1bXVsYXRpdmVfbmJwX3N0YW4gPC0gY3Vtc3VtKG5icF9zdGFuKQoKbWF0cGxvdCh5ZWFycywgdChjdW11bGF0aXZlX25icF9lbnMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSBjKC0xMzAsIDI1MCksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSwgCiAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjdW11bGF0aXZlIE5CUCcsIHhsYWIgPSAnJywKICAgICAgICAgYnR5ID0gJ24nLCB4bGltID0gYygxODUwLCAyMDIwKSkKCm1hdGxpbmVzKHllYXJzLCB0KGN1bXVsYXRpdmVfbmJwX2Vuc193YXZlMDEpLAogICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDE1MCksCiAgICAgICAgIGx0eSA9ICdzb2xpZCcpCgptYXRsaW5lcyh5ZWFycywgdChjdW11bGF0aXZlX25icF9lbnNfd2F2ZTAxW2xldmVsMl9peF93YXZlMDEsIF0pLAogICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxX2xldmVsMmNvbCwgMTUwKSwKICAgICAgICAgbHR5ID0gJ3NvbGlkJykKCgpsaW5lcyh5ZWFycywgY3VtdWxhdGl2ZV9uYnBfc3RhbiwgY29sID0gbWFrZVRyYW5zcGFyZW50KHN0YW5jb2wsIDIwMCksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSApCgoKbGVnZW5kKCd0b3BsZWZ0JywgbGVnZW5kID0gYygnd2F2ZTAwJywgJ3dhdmUwMScsICd3YXZlMDEgY29uc3RyYWluZWQnLCAnc3RhbmRhcmQnKSwgY29sID0gYyh3YXZlMDBjb2wsIHdhdmUwMWNvbCwgd2F2ZTAxX2xldmVsMmNvbCwgc3RhbmNvbCksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSkKCmBgYAoKIyMgRWRkeSBzdWdnZXN0cyBtZWFzdXJpbmcgY3VtdWxhdGl2ZSBOQlAgYWdhaW5zdCBhdG1vc3BoZXJpYyBncm93dGggcmF0ZQoKYGBge3J9CgojIEN1bXVsYXRpdmUgTkJQIGF0IHRoZSBlbmQgb2YgdGhlIHJ1bgpjbmJwX21vZGVybl9lbnMgPC0gYXBwbHkoY3VtdWxhdGl2ZV9uYnBfZW5zWywgMTM1OjE2NF0sIDEsIG1lYW4pCgpjbmJwX21vZGVybl93YXZlMDEgPC0gYXBwbHkoY3VtdWxhdGl2ZV9uYnBfZW5zX3dhdmUwMVssIDEzNToxNjRdLCAxLCBtZWFuKQoKY25icF9tb2Rlcm5fc3RhbiA8LSBtZWFuKGN1bXVsYXRpdmVfbmJwX3N0YW5bMTM1OjE2NF0pCgoKCmBgYAoKQ2FsY3VsYXRlIHRoZSBhdG1vc3BoZXJpYyBncm93dGggcmF0ZSBvZiAxOTg0LSAyMDEzIHVzaW5nIGEgc2ltcGxlIGxpbmVhciBmaXQKCmBgYHtyfQojIGFnciA9IGF0bW9zcGhlcmljIGdyb3d0aCByYXRlCiMgYWdpYXYgPSBhdG1vc3BoZXJpYyBncm93dGggaW50ZXJhbm51YWwgdmFyaWFiaWxpdHkKCmFncl9tb2Rlcm5fZW5zIDwtIHJlcChOQSwgbGVuZ3RoID0gbnJvdyhhZykpCmFnaWF2X21vZGVybl9lbnMgPC0gcmVwKE5BLCBsZW5ndGggPSBucm93KGFnKSkKCmZvcihpIGluIDE6bnJvdyhhZykpewogIAogIGRhdCA8LSBkYXRhLmZyYW1lKHQgPTE6MzAsIGFnID0gIGFnW2ksIDEzNToxNjRdKQogIGZpdCA8LSBsbShhZyB+IHQsIGRhdGEgPSBkYXQpCiAgYWdyX21vZGVybl9lbnNbaV0gPC0gY29lZihmaXQpWyd0J10KICBhZ2lhdl9tb2Rlcm5fZW5zW2ldIDwtIHNkKGZpdCRyZXNpZHVhbHMpCn0KCgphZ3JfbW9kZXJuX3dhdmUwMSA8LSByZXAoTkEsIGxlbmd0aCA9IG5yb3coYWcwMSkpCmFnaWF2X21vZGVybl93YXZlMDEgPC0gcmVwKE5BLCBsZW5ndGggPSBucm93KGFnMDEpKQoKZm9yKGkgaW4gMTpucm93KGFnMDEpKXsKICAKICBkYXQgPC0gZGF0YS5mcmFtZSh0ID0xOjMwLCBhZyA9ICBhZzAxW2ksIDEzNToxNjRdKQogIGZpdCA8LSBsbShhZyB+IHQsIGRhdGEgPSBkYXQpCiAgYWdyX21vZGVybl93YXZlMDFbaV0gPC0gY29lZihmaXQpWyd0J10KICBhZ2lhdl9tb2Rlcm5fd2F2ZTAxW2ldIDwtIHNkKGZpdCRyZXNpZHVhbHMpCn0KCmRhdCA8LSBkYXRhLmZyYW1lKHQgPTE6MzAsIGFnID0gIGFnX3N0YW5bMTM1OjE2NF0pCmFncl9zdGFuX2ZpdCA8LSBsbShhZyB+IHQsIGRhdGEgPSBkYXQpIAphZ3Jfc3RhbiA8LSBjb2VmKGFncl9zdGFuX2ZpdClbJ3QnXQphZ2lhdl9zdGFuIDwtIHNkKGFncl9zdGFuX2ZpdCRyZXNpZHVhbHMpCiAgCiAgCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQoKcGxvdChhZ3JfbW9kZXJuX2VucywgY25icF9tb2Rlcm5fZW5zLCAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLAogICAgIHlsaW0gPSBjKC0xMjAsMjIwKSwgcGNoID0gMTksCiAgICAgeGxhYiA9ICdBdG1vc3BoZXJpYyBncm93dGggcmF0ZSAxOTg0LTIwMTQnLAogICAgIHlsYWIgPSAnQ3VtdWxhdGl2ZSBOQlAgZnJvbSBwcmVpbmR1c3RyaWFsIGJ5IDE5ODQtMjAxMycKICAgICApCgpjbmJwX3dhdmUwMV9jb2xzIDwtIHJlcCh3YXZlMDFjb2wsIGxlbmd0aChjbmJwX21vZGVybl93YXZlMDEpKQpjbmJwX3dhdmUwMV9jb2xzW2xldmVsMl9peF93YXZlMDFdIDwtIHdhdmUwMV9sZXZlbDJjb2wgCgpwb2ludHMoIGFncl9tb2Rlcm5fd2F2ZTAxLGNuYnBfbW9kZXJuX3dhdmUwMSwgY29sID0gbWFrZVRyYW5zcGFyZW50KGNuYnBfd2F2ZTAxX2NvbHMsIDE1MCksIHBjaCA9IDE5KQpwb2ludHMoIGFncl9zdGFuLGNuYnBfbW9kZXJuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIHBjaCA9IDE5LCBjZXggPSAxLjUpCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJywgJ3dhdmUwMSBjb25zdHJhaW5lZCcsICdzdGFuZGFyZCcpLCBjb2wgPSBjKHdhdmUwMGNvbCwgd2F2ZTAxY29sLCB3YXZlMDFfbGV2ZWwyY29sLCBzdGFuY29sKSwgcGNoID0gMTkpCgpwcmludChjKCdjb3JyZWxhdGlvbiBhZ3IgdnMgY25icCAoYWxsIG1lbWJlcnMpJywgY29yKGFncl9tb2Rlcm5fZW5zLCBjbmJwX21vZGVybl9lbnMpKSkKCnByaW50KGMoJ2NvcnJlbGF0aW9uIGFnciB2cyBjbmJwICh3YXZlMDEpJywgY29yKGFncl9tb2Rlcm5fd2F2ZTAxLCBjbmJwX21vZGVybl93YXZlMDEpKSkKCmZpdF93YXZlMDAgPC0gbG0oYWdyX21vZGVybl9lbnMgfiBjbmJwX21vZGVybl9lbnMpCmZpdF93YXZlMDEgPC0gbG0oYWdyX21vZGVybl93YXZlMDEgfiBjbmJwX21vZGVybl93YXZlMDEpCgpwcmludChzdW1tYXJ5KGZpdF93YXZlMDApKQpwcmludChzdW1tYXJ5KGZpdF93YXZlMDEpKQoKYGBgCkludGVyYW5udWFsIHZhcmlhYmlsaXR5IGFuZCBjdW11bGF0aXZlIE5CUCAgCgooY29ycmVsYXRpb25zIGFyZSBjbG9zZSB0byB6ZXJvLCBlc3BlY2lhbGx5IGluIHRoZSBsYXRlciB3YXZlKQoKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KCnBsb3QoYWdpYXZfbW9kZXJuX2VucywgY25icF9tb2Rlcm5fZW5zLCAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLAogICAgIHlsaW0gPSBjKC0xMjAsMjIwKSwgcGNoID0gMTksCiAgICAgeGxhYiA9ICdBdG1vc3BoZXJpYyBncm93dGggSUFWIDE5ODQtMjAxNCcsCiAgICAgeWxhYiA9ICdDdW11bGF0aXZlIE5CUCBmcm9tIHByZWluZHVzdHJpYWwgYnkgMTk4NC0yMDEzJwogICAgICkKCnBvaW50cyggYWdpYXZfbW9kZXJuX3dhdmUwMSwgY25icF9tb2Rlcm5fd2F2ZTAxLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoY25icF93YXZlMDFfY29scywgMTUwKSwgcGNoID0gMTkpCnBvaW50cyggYWdpYXZfc3RhbixjbmJwX21vZGVybl9zdGFuLCBjb2wgPSBzdGFuY29sLCBwY2ggPSAxOSwgY2V4ID0gMS41KQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsICd3YXZlMDEnLCAnd2F2ZTAxIGNvbnN0cmFpbmVkJywgJ3N0YW5kYXJkJyksIGNvbCA9IGMod2F2ZTAwY29sLCB3YXZlMDFjb2wsIHdhdmUwMV9sZXZlbDJjb2wsIHN0YW5jb2wpLCBwY2ggPSAxOSkKCmBgYAoKCmBgYHtyfQoKCnByaW50KGNvcihhZ2lhdl9tb2Rlcm5fZW5zLCBjbmJwX21vZGVybl9lbnMpKQpwcmludChjb3IoIGFnaWF2X21vZGVybl93YXZlMDEsIGNuYnBfbW9kZXJuX3dhdmUwMSkpCgpgYGAKCgojIyBIb3cgY2xvc2UgY2FuIHdlIGdldCB0aGUgbW9kZWwgdG8gcmVhbGl0eT8KClVzaW5nIEF0bW9zcGhlcmljIEdyb3d0aCBSYXRlIGFzIGFuIGV4YW1wbGUsIGhvdyBjbG9zZSBjYW4gd2UgZ2V0IHRoZSBtb2RlbCB0byBvYnNlcnZhdGlvbnM/IENhbiB3ZSBkbyBiZXR0ZXIgdGhhbiBzdGFuZGFyZD8gV2hhdCBhcmUgdGhlIHRyYWRlIG9mZnMgb2YgZG9pbmcgc28/IEhvdyBkb2VzIGdldHRpbmcgY2xvc2UgaW4gQUdSIGFmZmVjdCBwZXJmb3JtYW5jZSBpbiBvdGhlciBvdXRwdXRzPwoKYGBge3J9CiMgRGVmaW5lIHRoZSBvYnNlcnZlZCBhdG1vc3BoZXJpYyBncm93dGggcmF0ZS4KCmFnX29icyA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGBbd2hpY2goaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIgJWluJSB5ZWFycyldCgojIE1vZGVsIGRlcGFydHVyZSBmcm9tIG9ic2VydmF0aW9ucyBvZiBhdG1vc3BoZXJpYyBncm93dGgKYWdfZXJyIDwtIHN3ZWVwKGFnLCAyLCBhZ19vYnMsIEZVTiA9ICctJykKYWcwMV9lcnIgPC0gc3dlZXAoYWcwMSwgMiwgYWdfb2JzLCBGVU4gPSAnLScpCgoKbG9uZ19tb2Rlcm5feWVhcnMgPC0gMTk2MDoyMDEzCmFnX21vZGVybl9peCA8LSB3aGljaCggeWVhcnMgJWluJSBsb25nX21vZGVybl95ZWFycykKCmFnX2Vycl9tb2Rlcm4gPC0gYWdfZXJyWywgYWdfbW9kZXJuX2l4XQphZzAxX2Vycl9tb2Rlcm4gPC0gYWcwMV9lcnJbLCBhZ19tb2Rlcm5faXhdCgoKYWdfZXJyX3N0YW4gPC0gYWdfc3RhbiAtIGFnX29icwphZ19lcnJfc3Rhbl9tb2Rlcm4gPC0gYWdfZXJyX3N0YW5bYWdfbW9kZXJuX2l4XQoKYGBgCgpgYGB7cn0KbWF0cGxvdChsb25nX21vZGVybl95ZWFycywgdChhZ19lcnJfbW9kZXJuW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0pLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAxMDApLCBtYWluID0gJ0Ftb3NwaGVyaWMgR3Jvd3RoIEVycm9yJykKCmVycmNvbCA8LSByZXAod2F2ZTAxY29sLCBucm93KGFnMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSkpCiNlcnJjb2xbbGV2ZWwyX2l4X3dhdmUwMV0gPC0gd2F2ZTAxX2xldmVsMmNvbAptYXRsaW5lcyhsb25nX21vZGVybl95ZWFycywgdChhZzAxX2Vycl9tb2Rlcm5bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSksIGNvbCA9IG1ha2VUcmFuc3BhcmVudChlcnJjb2wsIDEwMCksIGx0eSA9ICdzb2xpZCcpCm1hdGxpbmVzKGxvbmdfbW9kZXJuX3llYXJzLCB0KGFnMDFfZXJyX21vZGVybltsZXZlbDJhX2l4X3dhdmUwMSwgXSksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFfbGV2ZWwyY29sLDEwMCksIGx0eSA9ICdzb2xpZCcpCgpsaW5lcyhsb25nX21vZGVybl95ZWFycywgYWdfZXJyX3N0YW5fbW9kZXJuLCBjb2wgPSBzdGFuY29sKQoKbGVnZW5kKCdib3R0b21sZWZ0JywgbGVnZW5kID0gYygnd2F2ZTAwJywgJ3dhdmUwMScsICd3YXZlMDEgY29uc3RyYWluZWQnLCAnc3RhbmRhcmQnKSwgY29sID0gYyh3YXZlMDBjb2wsIHdhdmUwMWNvbCwgd2F2ZTAxX2xldmVsMmNvbCwgc3RhbmNvbCksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSkKCmFibGluZShoPTApCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDd9CgojIEF0bW9zcGhlcmljIGdyb3d0aCBtZWFuIGVycm9yCmFnX21vZGVybl9tZSA8LSBhcHBseShhZ19lcnJfbW9kZXJuLDEsbWVhbikKYWcwMV9tb2Rlcm5fbWUgPC0gYXBwbHkoYWcwMV9lcnJfbW9kZXJuLDEsIG1lYW4pCmFnX21vZGVybl9tZV9zdGFuIDwtIG1lYW4oYWdfZXJyX3N0YW5bYWdfbW9kZXJuX2l4XSkKCgojIE1lYW4gYWJzb2x1dGUgZXJyb3IKYWdfbW9kZXJuX21hZSA8LSBhcHBseShhYnMoYWdfZXJyX21vZGVybiksMSxtZWFuKQphZzAxX21vZGVybl9tYWUgPC0gYXBwbHkoYWJzKGFnMDFfZXJyX21vZGVybiksMSwgbWVhbikKYWdfbW9kZXJuX21hZV9zdGFuIDwtIG1lYW4oYWJzKGFnX2Vycl9zdGFuW2FnX21vZGVybl9peF0pKQoKCgojIFJvb3QgbWVhbiBzcXVhcmUgZXJyb3IKYWdfbW9kZXJuX3Jtc2UgPC0gYXBwbHkoYWdfZXJyX21vZGVybiwxLCBmdW5jdGlvbih4KSBzcXJ0KG1lYW4oeF4yKSkpCmFnMDFfbW9kZXJuX3Jtc2UgPC0gYXBwbHkoYWcwMV9lcnJfbW9kZXJuLDEsIGZ1bmN0aW9uKHgpIHNxcnQobWVhbih4XjIpKSkKYWdfbW9kZXJuX3Jtc2Vfc3RhbiA8LSBzcXJ0KG1lYW4oYWdfZXJyX3N0YW5bYWdfbW9kZXJuX2l4XV4yKSkKCiMgVGhlcmUgYXJlIHNvbWUgYmlnIG91dGxpZXJzIApvdXRsaWVyX2l4X3dhdmUwMSA8LSB3aGljaChhYnMoYWcwMV9tb2Rlcm5fbWUgKT4gMTAwKQoKcGFyKG1mcm93ID0gYygyLDEpKQpoaXN0KGFnX21vZGVybl9tZSwgbWFpbiA9ICdBdG1vc3BoZXJpYyBncm93dGggbWVhbiBlcnJvcicsIGNvbCA9IHdhdmUwMGNvbCwgeGxpbSA9IGMoLTMsIDMpKQpydWcoYWdfbW9kZXJuX21lX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9IDIpCmhpc3QoYWcwMV9tb2Rlcm5fbWVbLW91dGxpZXJfaXhfd2F2ZTAxXSwgY29sID0gd2F2ZTAxY29sLCB4bGltID0gYygtMywzKSwgbWFpbiA9ICcnKQpydWcoYWdfbW9kZXJuX21lX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9IDIpCgpwYXIobWZyb3cgPSBjKDIsMSkpCmhpc3QoYWdfbW9kZXJuX21hZSwgbWFpbiA9ICdBdG1vc3BoZXJpYyBncm93dGggbWVhbiBhYnNvbHV0ZSBlcnJvcicsIGNvbCA9IHdhdmUwMGNvbCwgeGxpbSA9IGMoMCwgMykpCnJ1ZyhhZ19tb2Rlcm5fbWFlX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9IDIpCmhpc3QoYWcwMV9tb2Rlcm5fbWFlWy1vdXRsaWVyX2l4X3dhdmUwMV0sIGNvbCA9IHdhdmUwMWNvbCwgbHdkID0gMiwgeGxpbSA9IGMoMCwzKSwgbWFpbiA9ICcnKQpydWcoYWdfbW9kZXJuX21hZV9zdGFuLCBjb2wgPSBzdGFuY29sLCBsd2QgPSAyKQoKcGFyKG1mcm93ID0gYygyLDEpKQpoaXN0KGFnX21vZGVybl9ybXNlLCB4bGltID0gYygwLDMpLCBjb2wgPSB3YXZlMDBjb2wsIG1haW4gPSAnQXRtb3NwaGVyaWMgZ3Jvd3RoIFJNU0UnKQpydWcoYWdfbW9kZXJuX3Jtc2Vfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0gMiApCmhpc3QoYWcwMV9tb2Rlcm5fcm1zZVstb3V0bGllcl9peF93YXZlMDFdLCBjb2wgPSB3YXZlMDFjb2wsIHhsaW0gPSBjKDAsMyksIG1haW4gPSAnJykKcnVnKGFnX21vZGVybl9ybXNlX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9IDIgKQoKCgpgYGAKCgpXZSd2ZSBlc3RhYmxpc2hlZCB0aGF0IG1vc3Qgb2YgdGhlIG9yaWdpbmFsIGVuc2VtYmxlIGhhdmUgYW4gTUUvTUFFL1JNU0UgbGFyZ2VyIHRoYW4gdGhlIHN0YW5kYXJkIHJ1bi4gTW9yZSAoYnV0IGZldykgb2YgdGhlIHdhdmUwMSBwZXJmb3JtIGJldHRlciB0aGFuIHN0YW5kYXJkLiAKCmBgYHtyfQoKCmJldHRlcl9peF9hZ19ybXNlIDwtIHdoaWNoKGFnX21vZGVybl9ybXNlIDwgYWdfbW9kZXJuX3Jtc2Vfc3RhbikKYmV0dGVyX2l4X2FnMDFfcm1zZSA8LSB3aGljaChhZzAxX21vZGVybl9ybXNlIDwgYWdfbW9kZXJuX3Jtc2Vfc3RhbikKCgpYX2JldHRlcl9hZyA8LSByYmluZChYW2JldHRlcl9peF9hZ19ybXNlLCBdLCBYX3dhdmUwMV90cmFpbltiZXR0ZXJfaXhfYWcwMV9ybXNlLCBdKQoKYGBgCgoKQSBtYXAgb2YgdGhlIDJEIHByb2plY3Rpb25zIG9mIHBhcmFtZXRlciBzcGFjZSB3aGVyZSB0aGUgZW5zZW1ibGUgbWVtYmVyIHBlcmZvcm1zIGJldHRlciB0aGFuIHN0YW5kYXJkLiAgCgpUaGUgYmx1ZSBwYXJ0IGlzIHRoZSBmaXJzdCB3YXZlLCBhbmQgbm90IHN1YmplY3QgdG8gY29uc3RyYWludCBzbyBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgc2Vjb25kIHdhdmUgKHdhdmUwMSkuCgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpiZXR0ZXJfaXggPC0gMTpucm93KFhfYmV0dGVyX2FnKQoKYmV0dGVyX2NvbHMgPC0gYyhyZXAod2F2ZTAwY29sLCBsZW5ndGgoYmV0dGVyX2l4X2FnX3Jtc2UpKSwgcmVwKHdhdmUwMWNvbCxsZW5ndGgoYmV0dGVyX2l4X2FnMDFfcm1zZSkpKQoKcGFpcnMoWF9iZXR0ZXJfYWcsCiAgICAgIGNvbCA9IGJldHRlcl9jb2xzLAogICAgICBnYXAgPSAwLAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwY2ggPSAxOSwKICAgICAgY2V4PSAwLjgsCiAgICAgIGxvd2VyLnBhbmVsID0gTlVMTCkKCgoKYGBgCgojIyBCdWlsZCBlbXVsYXRvcnMgYW5kIGZpbmQgcGFydHMgb2YgcGFyYW1ldGVyIHNwYWNlIHRoYXQgdG8gYmV0dGVyIHRoYW4gc3RhbmRhcmQgYXQgYXRtb3NwaGVyaWMgZ3Jvd3RoLgoKSGF2aW5nIHRyb3VibGUgZml0dGluZyBSTVNFLCB0byB0cnlpbmcgbWVhbiBlcnJvci4KCldoeSBpcyB0aGVyZSBhbiBvZGQgY29sbGVjdGlvbiBhdCBqdXN0IHVuZGVyIDE/CgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KIyB0aGVyZSBhcmUgMTAwIHdhdmUwMSBlbnNlbWJsZSBtZW1iZXJzIHRoYXQgcGFzcyB0aGUgbGV2ZWwgMiBjb25zdHJhaW5zdApsZW5ndGgobGV2ZWwyX2l4X3dhdmUwMSkKCmJldHRlcl9peF9hZ19tZSA8LSB3aGljaChhYnMoYWdfbW9kZXJuX21lKSA8IGFicyhhZ19tb2Rlcm5fbWVfc3RhbikpCgojIFRoZXJlIGFyZSAxMDQgdGhhdCBoYXZlIGEgc21hbGxlciBtZWFuIGVycm9yIHRoYW4gc3RhbmRhcmQKYmV0dGVyX2l4X2FnMDFfbWUgPC0gd2hpY2goYWJzKGFnMDFfbW9kZXJuX21lKSA8IGFicyhhZ19tb2Rlcm5fbWVfc3RhbikpCgojIFRoZXJlIGFyZSBvbmx5IDQxIHRoYXQgcGFzcyBsZXZlbCAyIEFORCBoYXZlIHNtYWxsZXIgZXJyb3IgdGhhbiBzdGFuZGFyZApsZXZlbDJfYW5kX2JldHRlcl9hZzAxX2l4IDwtIGludGVyc2VjdChsZXZlbDJfaXhfd2F2ZTAxLCBiZXR0ZXJfaXhfYWcwMV9tZSkKCmBgYAoKVGhpcyBuZXh0IHBhaXJzIHBsb3QgbG9va3MgYXQgYWxsIHRoZSBlbnNlbWJsZSBtZW1iZXJzIHRoYXQgaGF2ZSBhIGJldHRlciBtZWFuIGF0bW9zcGhlcmljIGdyb3d0aCBlcnJvciB0aGFuIHN0YW5kYXJkLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9ClhfYmV0dGVyX2FnIDwtIHJiaW5kKFhbYmV0dGVyX2l4X2FnX21lLCBdLCBYX3dhdmUwMV90cmFpbltiZXR0ZXJfaXhfYWcwMV9tZSwgXSkKCmJldHRlcl9peCA8LSAxOm5yb3coWF9iZXR0ZXJfYWcpCgpiZXR0ZXJfY29scyA8LSBjKG1ha2VUcmFuc3BhcmVudChyZXAod2F2ZTAwY29sLCBsZW5ndGgoYmV0dGVyX2l4X2FnX21lKSksIDEwMCksIG1ha2VUcmFuc3BhcmVudChyZXAod2F2ZTAxY29sLGxlbmd0aChiZXR0ZXJfaXhfYWcwMV9tZSkpLCAxMDApKQoKcGFpcnMoWF9iZXR0ZXJfYWcsCiAgICAgIGNvbCA9IGJldHRlcl9jb2xzLAogICAgICBnYXAgPSAwLAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwY2ggPSAxOSwKICAgICAgY2V4PSAwLjgsCiAgICAgIGxvd2VyLnBhbmVsID0gTlVMTCkKYGBgCgpUaGlzIG5leHQgcGxvdCBsb29rcyBhdCBhbGwgdGhlIGVuc2VtYmxlIG1lbWJlcnMgdGhhdCBoYXZlIGEgYmV0dGVyIG1lYW4gYXRtb3NwaGVyaWMgZ3Jvd3RoIGVycm9yIHRoYW4gc3RhbmRhcmQgQU5EIHBhc3MgdGhlIGxldmVsIDIgY29uc3RyYWludHMuICAKClRoZSBudW1iZXIgaXMgc21hbGwgKDQxLzMwMCksIGJ1dCB0aGUgZW5zZW1ibGUgbWVtYmVycyBzZWVtIHNwcmVhZCBhY3Jvc3MgcGFyYW1ldGVyIHNwYWNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpYX2xldmVsMl9hbmRfYmV0dGVyX2FnMDEgPC0gWFtsZXZlbDJfYW5kX2JldHRlcl9hZzAxX2l4LCBdCnBhaXJzKFhfbGV2ZWwyX2FuZF9iZXR0ZXJfYWcwMSwKICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDE1MCksCiAgICAgIGdhcCA9IDAsCiAgICAgIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBjaCA9IDE5LAogICAgICBjZXg9IDAuOCwKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMKQoKYGBgCgoKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoRGljZUtyaWdpbmcpCgphZzAxX291dGxpZXJfaXggPC0gd2hpY2goYWcwMV9tb2Rlcm5fbWUgPiAxMCkKCmZpdF9hZ19tZSA8LSBrbSh+LiwgZGVzaWduID0gWF93YXZlMDFfdHJhaW5bLWFnMDFfb3V0bGllcl9peCwgXSwgcmVzcG9uc2UgPSBhZzAxX21vZGVybl9tZVstYWcwMV9vdXRsaWVyX2l4XSwgCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KG1heGl0ID0gMjAwKSkKCmBgYAoKYGBge3J9CgpwbG90KGZpdF9hZ19tZSkKCgoKCmBgYAoKYGBge3J9CmxpYnJhcnkoZW10b29scykKbGlicmFyeShpbXB0b29scykKbGlicmFyeSh2aXp0b29scykKCm51bmlmIDwtIDEwMDAwMApYX3VuaWYgPC0gc2FtcF91bmlmKG51bmlmLCBtaW5zID0gcmVwKDAsMzIpLCBtYXhlcyA9IHJlcCgxLCAzMikpCmNvbG5hbWVzKFhfdW5pZikgPC0gY29sbmFtZXMoWCkKCnByZWRfdW5pZl9hZyA8LSBwcmVkaWN0LmttKGZpdF9hZ19tZSwgbmV3ZGF0YSA9IFhfdW5pZiwgdHlwZSA9ICdVSycgKSAKCiMgS2VlcHMgYWJvdXQgMjAlClhfa2VwdF9peCA8LSB3aGljaChhYnMocHJlZF91bmlmX2FnJG1lYW4pIDwgYWJzKGFnX21vZGVybl9tZV9zdGFuKSkKCgoobGVuZ3RoKFhfa2VwdF9peCkgLyBudW5pZikgKiAxMDAKIyB0aGlzIGlzIDglCiNYX2tlcHRfaXggPC0gd2hpY2goYWJzKHByZWRfdW5pZiRtZWFuKSA8IDAuMSkKCgpgYGAKCgojIyBJbnB1dCBzcGFjZSB3aXRoIGxvdyBBdG1vc3BoZXJpYyBHcm93dGggRXJyb3IKVGhpcyBwYWlycyBwbG90IHNob3dzIHRoZSAyZCBhbmQgbWFyZ2luYWwgZGVuc2l0eSBvZiBlbXVsYXRlZCBpbnB1dCBwb2ludHMgd2hlcmUgdGhlIGVtdWxhdGVkIGF0bW9zcGhlcmljIGdyb3d0aCBpcyBjbG9zZXIgdG8gdGhlIG9ic2VydmF0aW9ucyB0aGFuIHRoZSBzdGFuZGFyZCBtb2RlbC4KClRoaXMgdGVjaG5pcXVlIG1pZ2h0IHByb3ZpZGUgYSB1c2VmdWwgc2V0IG9mIHBvaW50cyBmb3Igb3B0aW1pc2luZyB0aGUgbW9kZWwgKGF0IGxlYXN0IHRvIGF0bW9zcGhlcmljIGdyb3d0aCkuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZyA9IEZBTFNFfQojcGFpcnMoWF91bmlmW1hfa2VwdF9peCwgXVsxOjUwLF0sCiMgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJyw1MCksCiMgICAgICBnYXAgPSAwLAojICAgICAgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKIyAgICAgIHBjaCA9IDE5LAojICAgICAgY2V4PSAwLjgsCiMgICAgICBsb3dlci5wYW5lbCA9IE5VTEwpCgpwYXIob21hID0gYygwLDAsMCwzKSwgYmcgPSAnd2hpdGUnKQoKCnBhbmVsLmhpc3QgPSBmdW5jdGlvbih4LCAuLi4pIHsKICB1c3IgPSBwYXIoInVzciIpOyBvbi5leGl0KHBhcih1c3IpKQogIHBhcih1c3IgPSBjKHVzclsxOjJdLCAwLCAxLjUpKQogIGhpc3QoeCwgZnJlcSA9IEZBTFNFLCBjb2w9ImN5YW4iLCBhZGQ9VFJVRSkgCiAgbGluZXMoZGVuc2l0eSh4KSkKfQoKcGFpcnMoWF91bmlmW1hfa2VwdF9peCwgXSwKICAgICMgIGxhYmVscyA9IDE6ZCwKICAgICAgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBOVUxMLCB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwYW5lbCA9IGRmdW5jX3VwLAogICAgICBkaWFnLnBhbmVsID0gcGFuZWwuaGlzdCwKICAgICAgY2V4LmxhYmVscyA9IDEsCiAgICAgIGNvbC5heGlzID0gJ3doaXRlJywKICAgICAgZGZ1bmNfY29sID0gcmIpCgpgYGAKCk5leHQsIGNoZWNrIGVtdWxhdG9ycyBvZiBhbGwgdGhlIG90aGVyIG91dHB1dHMgYW5kIGFwcGx5IHRoZSBjb25zdHJhaW50cyB0byB0aGVtLiBTZWUgaG93IHRoZSBjb25zdHJhaW50cyBjaGFuZ2UuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCgojIEZpcnN0LCB0cnkgdGhlIGVtdWxhdG9ycyBidWlsdCB1c2luZyBqdXN0IHdhdmUwMQojZml0X2xpc3RfY29uc3RfbGV2ZWwxYQoKCllfY29uc3RfcHJlZF91bmlmX21lYW4gPC0gbWF0cml4KE5BLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSwgbnJvdyA9IG5yb3coWF91bmlmKSkKY29sbmFtZXMoWV9jb25zdF9wcmVkX3VuaWZfbWVhbikgPC0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkKCllfY29uc3RfcHJlZF91bmlmX3NkIDwtIG1hdHJpeChOQSwgbmNvbCA9IG5jb2woWV9jb25zdF9sZXZlbDFhX3NjYWxlZCksIG5yb3cgPSBucm93KFhfdW5pZikpIApjb2xuYW1lcyhZX2NvbnN0X3ByZWRfdW5pZl9zZCkgPC0gY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkKCmZvcihpIGluIDE6bGVuZ3RoKGZpdF9saXN0X2NvbnN0X2xldmVsMWEpKXsKICAKICBwcmVkX3VuaWYgPC0gcHJlZGljdC5rbShvYmplY3Q9Zml0X2xpc3RfY29uc3RfbGV2ZWwxYVtbaV1dLCBuZXdkYXRhID0gWF91bmlmLCB0eXBlID0gJ1VLJykKICAKICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWyxpIF0gPC0gcHJlZF91bmlmJG1lYW4KICBZX2NvbnN0X3ByZWRfdW5pZl9zZFssaSBdIDwtIHByZWRfdW5pZiRzZAp9CgoKYGBgCgojIyBJbnB1dCBzcGFjZSB3aXRoIGVtdWxhdGVkIG1lbWJlcnMgcGFzc2luZyBMZXZlbCAyIGNvbnN0cmFpbnRzLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTIsIHdhcm5pbmcgPSBGQUxTRX0KCmxldmVsMl9peF9lbSA8LSB3aGljaChZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbmJwX2xuZF9zdW0nXSA+IDAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddIDwgODAwCiAgICAgICAgICAgICAgICAgICkKCnBhaXJzKFhfdW5pZltsZXZlbDJfaXhfZW0sIF0sCiAgICAjICBsYWJlbHMgPSAxOmQsCiAgICAgIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGFuZWwgPSBkZnVuY191cCwKICAgICAgZGlhZy5wYW5lbCA9IHBhbmVsLmhpc3QsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jX2NvbCA9IHJiKQoKKGxlbmd0aChsZXZlbDJfaXhfZW0pIC8gbnVuaWYpICogMTAwCmBgYAoKIyMgSW5wdXQgc3BhY2Ugd2l0aCBlbXVsYXRlZCBtZW1iZXJzIHBhc3NpbmcgTGV2ZWwgMiBjb25zdHJhaW50cyBBTkQgbG93IGF0bW9zcGhlcmljIGdyb3d0aCBlcnJvcgpFbXVsYXRlZCBtZW1iZXJzIHBhc3NpbmcgbGV2ZWwyIGNvbnN0cmFpbnRzIEFORCBoYXZpbmcgbG93ZXIgZXJyb3IgaW4gYXRtb3NwaGVyaWMgZ3Jvd3RoIHRoYW4gc3RhbmRhcmQuIAoKUmVkIHBvaW50IGluZGljYXRlcyB0aGUgc3RhbmRhcmQgaW5wdXQuCgpUaGUgcG9zaXRpb24gb2YgdGhlIHN0YW5kYXJkIGlucHV0IHdpdGggcmVnYXJkcyB0byB0aGUgaGlzdG9ncmFtcyBnaXZlIHVzIGFuIGlkZWEgb2Ygd2hhdCB3ZSBtaWdodCBkbyB0byBpbXByb3ZlIHRoZSBzaW11bGF0aW9uIC0gYXQgbGVhc3QgaW4gdGVybXMgb2YgYXRtb3NwaGVyaWMgZ3Jvd3RoLiBJZiB3ZSB3ZXJlIHRvIG1vdmUgdGhlIGlucHV0IHRvd2FyZHMgYXJlYXMgb2YgaGlnaGVyIGRlbnNpdHksIHdlIG1pZ2h0IGV4cGVjdCBhIGJldHRlciBtb2RlbCBwZXJmb3JtYW5jZS4KCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZyA9IEZBTFNFfQoKWF9zdGFuX25vcm0gPC0gbm9ybWFsaXplKG1hdHJpeChyZXAoMSwgMzIpLCBucm93ID0gMSksIHdydCA9IGxocykKCmxldmVsMl9hbmRfYWdfaXhfZW0gPC0gd2hpY2goWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ25icF9sbmRfc3VtJ10gPiAwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbnBwX25saW1fbG5kX3N1bSddID4gMzUgJiBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCAmCiAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA8IDgwMCAmCiAgICAgICAgICAgICAgICAgICAgYWJzKHByZWRfdW5pZl9hZyRtZWFuKSA8IGFicyhhZ19tb2Rlcm5fbWVfc3RhbikKICAgICAgICAgICAgICAgICAgKQoKCgpwYWlycyhyYmluZChYX3VuaWZbbGV2ZWwyX2FuZF9hZ19peF9lbSwgXSwgWF9zdGFuX25vcm0pLAogICAgIyAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXBfdHJ1dGgsCiAgICAgIGRpYWcucGFuZWwgPSBwYW5lbC5oaXN0LAogICAgICBjZXgubGFiZWxzID0gMSwKICAgICAgY29sLmF4aXMgPSAnd2hpdGUnLAogICAgICBkZnVuY19jb2wgPSByYikKCgoobGVuZ3RoKGxldmVsMl9hbmRfYWdfaXhfZW0pIC8gbnVuaWYpICogMTAwCmBgYAojIEV4cGxvcmluZyBmdXJ0aGVyIGNvbnN0cmFpbnRzCgpJdCdzIHByZXR0eSBjbGVhciB0aGF0IHRoZSAiaW5pdGlhbCIgKGxldmVsMikgY29uc3RyYWludHMgY2FuIGJlIGltcHJvdmVkIG9uLiBIb3cgYWJvdXQgdHJlZSwgc2hydWIgYW5kIGJhcmUgc29pbCBmcmFjdGlvbnM/CgpCdWlsZCBhbiBlbnNlbWJsZSBvZiBtb2Rlcm4gdmVnZXRhdGlvbiBmcmFjdGlvbnMuCmBgYHtyfQoKIyBuc3RhcnQgPC0gNDk5CiMgbmVuZCA8LSA3OTgKCiNpZiAoZmlsZS5leGlzdHMoImVuc2VtYmxlX3dhdmUwMS5yZGF0YSIpKSB7CiMgIGxvYWQoImVuc2VtYmxlX3dhdmUwMS5yZGF0YSIpCiN9IGVsc2Ugewp5X25hbWVzX2ZyYWNfbWVhbiA8LSBjKCd0cmVlRnJhY19sbmRfbWVhbicsICdjM1BmdEZyYWNfbG5kX21lYW4nLCAnYzRQZnRGcmFjX2xuZF9tZWFuJywgJ3NocnViRnJhY19sbmRfbWVhbicsICdiYXJlc29pbEZyYWNfbG5kX21lYW4nKQogIAplbnNfd2F2ZTAxX2ZyYWNfbWVhbl9tdiA8LSBtYWtlSnVsZXNFbnNlbWJsZU1vZGVyblZhbHVlKGVuc2xvYyA9ICcvc2NyYXRjaC9oYWRhdy9qdWxlc19wb3N0cHJvY2Vzcy91LWNrMDA2LycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybGlzdCA9IHlfbmFtZXNfZnJhY19tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gbnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVuZCA9IG5lbmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSAxNDQ6MTY0KSAKICAKIyAgc2F2ZShlbnNfd2F2ZTAxX212LCBmaWxlID0iZW5zZW1ibGVfd2F2ZTAxLnJkYXRhIikKI30KCgpgYGAKCgpgYGB7cn0KIyBXaGF0IGlmIHdlIGFsc28gaGFkIGEgInRvbGVyYW5jZSB0byBlcnJvciIgdGhhdCBsb29rZWQgbGlrZSB0aGlzLiBCYXNpY2FsbHkgbWFraW5nIHVwIGZvciB0aGUgZmFjdCB3ZSBoYXZlbid0IGdvdCAic3Ryb25nIiBvYnNlcnZhdGlvbnMgb2YgZnJhY3Rpb25zLCBidXQgbWlnaHQgaGF2ZSBhIHRvbGVyYW5jZSB0byBlcnJvciBvZiBzb21lIG9mIHRoZXNlIHByb3BlcnRpZXMuIFRoZXkgd291bGQgYXQgbGVhc3QgYWxsb3cgdXMgdG8gaWRlbnRpZnkgdHJhZGUtb2Zmcy4KCiMgdHJlZWZyYWMgMjAtIDQwCgojIHNocnViZnJhYyA8IDUKCiMgYmFyZXNvaWwgPCA0MAoKI2Rlc2lnbiA9IFhfd2F2ZTAxX3RyYWluWy1hZzAxX291dGxpZXJfaXgsIF0sCgpgYGAKCmBgYHtyfQpwYXIobWZyb3cgPSBjKDIsMykpCiMgYmluZCBlbnNlbWJsZSAwIChsZXZlbCAxYSkgYW5kIHdhdmUwMSBmcmFjdGlvbnMKWV9mcmFjX2xldmVsMWFfd2F2ZTAxIDwtIHJiaW5kKFlfbGV2ZWwxYVssIHlfbmFtZXNfZnJhY19tZWFuXSwgZW5zX3dhdmUwMV9mcmFjX21lYW5fbXYkZGF0bWF0IClbLTQ0MCwgXQoKCmZvcihpIGluIDE6bmNvbChZX2ZyYWNfbGV2ZWwxYV93YXZlMDEpKQp7CiAgCiAgaGlzdChZX2ZyYWNfbGV2ZWwxYV93YXZlMDFbMTpucm93KFlfbGV2ZWwxYSksaV0sIG1haW4gPSBjb2xuYW1lcyhZX2ZyYWNfbGV2ZWwxYV93YXZlMDEpW2ldLCB4bGFiID0gJycpCiAgaGlzdChZX2ZyYWNfbGV2ZWwxYV93YXZlMDFbKG5yb3coWV9sZXZlbDFhKSsxKSA6IG5yb3coWV9mcmFjX2xldmVsMWFfd2F2ZTAxKSwgaV0sICBhZGQgPSBUUlVFLCBjb2wgPSAnZ3JleScpCiAgCn0KYGBgCgoKCgpgYGB7cn0KIyBDcmVhdGUgZml0IGxpc3RzIGZvciB0aGUgY29tYmluZWQgZGF0YQpZX2ZyYWNfbGV2ZWwxYV93YXZlMDFfbGlzdCA8LSBtYXQybGlzdChZX2ZyYWNfbGV2ZWwxYV93YXZlMDEpCgpmaXRfbGlzdF9mcmFjX2xldmVsMWFfd2F2ZTAxIDwtIG1jbGFwcGx5KFggPSBZX2ZyYWNfbGV2ZWwxYV93YXZlMDFfbGlzdCwgRlVOID0ga20sIGZvcm11bGEgPSB+LiwgZGVzaWduID0gWF9sZXZlbDFhX3dhdmUwMVstNDQwLF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWMuY29yZXMgPSA0LCBjb250cm9sID0gbGlzdCh0cmFjZSA9IEZBTFNFKSkKCgpgYGAKCgpgYGB7cn0KCgoKZm9yKGkgaW4gMTpsZW5ndGgoZml0X2xpc3RfZnJhY19sZXZlbDFhX3dhdmUwMSkpCiAgCiAgcGxvdChmaXRfbGlzdF9mcmFjX2xldmVsMWFfd2F2ZTAxW1tpXV0pCgoKYGBgCgojIyBMZWF2ZS1vbmUtb3V0IGFuYWx5c2VzIG9mIGVtdWxhdG9yIHByZWRpY3Rpb24gYWNjdXJhY3kKCmBgYHtyfQoKbG9vbGlzdF9rbV9ZX2ZyYWNfbGV2ZWwxYV93YXZlMDEgPC0gbWNsYXBwbHkoWCA9IGZpdF9saXN0X2ZyYWNfbGV2ZWwxYV93YXZlMDEsIEZVTiA9IGxlYXZlT25lT3V0LmttLCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCgpgYGAKCgoKYGBge3J9CgoKWV9mcmFjX3ByZWRfdW5pZl9tZWFuIDwtIG1hdHJpeChOQSwgbmNvbCA9IG5jb2woWV9mcmFjX2xldmVsMWFfd2F2ZTAxKSwgbnJvdyA9IG5yb3coWF91bmlmKSkKY29sbmFtZXMoWV9mcmFjX3ByZWRfdW5pZl9tZWFuKSA8LSBjb2xuYW1lcyhZX2ZyYWNfbGV2ZWwxYV93YXZlMDEpCgpZX2ZyYWNfcHJlZF91bmlmX3NkIDwtIG1hdHJpeChOQSwgbmNvbCA9IG5jb2woWV9mcmFjX2xldmVsMWFfd2F2ZTAxKSwgbnJvdyA9IG5yb3coWF91bmlmKSkgCmNvbG5hbWVzKFlfZnJhY19wcmVkX3VuaWZfc2QpIDwtIGNvbG5hbWVzKFlfZnJhY19sZXZlbDFhX3dhdmUwMSkKCmZvcihpIGluIDE6bGVuZ3RoKGZpdF9saXN0X2ZyYWNfbGV2ZWwxYV93YXZlMDEpKXsKICAKICBwcmVkX3VuaWYgPC0gcHJlZGljdC5rbShvYmplY3QgPSBmaXRfbGlzdF9mcmFjX2xldmVsMWFfd2F2ZTAxW1tpXV0sIG5ld2RhdGEgPSBYX3VuaWYsIHR5cGUgPSAnVUsnKQogIAogIFlfZnJhY19wcmVkX3VuaWZfbWVhblssaSBdIDwtIHByZWRfdW5pZiRtZWFuCiAgWV9mcmFjX3ByZWRfdW5pZl9zZFssaSBdIDwtIHByZWRfdW5pZiRzZAp9CgoKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRSB9CgoKCmxldmVsMl9hbmRfYWdfYW5kX2ZyYWNfaXhfZW0gPC0gd2hpY2goWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ25icF9sbmRfc3VtJ10gPiAwICYKICAgICAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddIDwgODAwICYKICAgICAgICAgICAgICAgICAgICAgIGFicyhwcmVkX3VuaWZfYWckbWVhbikgPCBhYnMoYWdfbW9kZXJuX21lX3N0YW4pCiAgICAgICAgICAgICAgICAgICkKCgoKcGFpcnMocmJpbmQoWF91bmlmW2xldmVsMl9hbmRfYWdfaXhfZW0sIF0sIFhfc3Rhbl9ub3JtKSwKICAgICMgIGxhYmVscyA9IDE6ZCwKICAgICAgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBOVUxMLCB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwYW5lbCA9IGRmdW5jX3VwX3RydXRoLAogICAgICBkaWFnLnBhbmVsID0gcGFuZWwuaGlzdCwKICAgICAgY2V4LmxhYmVscyA9IDEsCiAgICAgIGNvbC5heGlzID0gJ3doaXRlJywKICAgICAgZGZ1bmNfY29sID0gcmIpCgoKKGxlbmd0aChsZXZlbDJfYW5kX2FnX2l4X2VtKSAvIG51bmlmKSAqIDEwMAoKKGxlbmd0aChsZXZlbDJfYW5kX2FnX2FuZF9mcmFjX2l4X2VtKSAvIG51bmlmKSAqIDEwMAoKCmBgYAoKCgoKCg==